
web : sbc.shef.ac.uk
twitter: SheffBioinfCore
email: bioinformatics-core@sheffield.ac.uk
Tutorial Overview and Background
This tutorial will cover the basics of NGS analysis using Galaxy; a open-source web-based platform for the analysis of biological data. You should gain an appreciation of the tasks involved in a typical NGS analysis and be comfortable with the outputs generated by a sequencing service. You will also use the Integrative Genomics Viewer (IGV) to view some of the data we generate in an interactive manner.
Parts of this tutorial are based on the tutorials from the Galaxy Training Network
We will be using Illumina short-read sequencing as our technology of interest, as it is by far the prevalent type of data available.
Using these notes
Sections with this background indicate exercises to be completed during the workshop.
Sections with this background give information about potential error messages you might encounter, or problems that might arise in your own data analysis.
A short introduction to Next Generation Sequencing can be found in this youtube video
The overall workflow used in the tutorial is summarised below:-

Experimental Design
Before embarking on any high-throughput experiment, it is important to pay due attention to the experimental design. This famous quote from the statistician R.A Fisher in the 1938 is still applicable to modern technologies
To call in the statistician after the experiment is done may be no more than asking him to perform a postmortem examination: he may be able to say what the experiment died of.
Experimental Design encompasses questions such as
- which controls to use?
- positive / negative controls
- healthy controls
- what experimental conditions?
- what technical and biological factors are present?
When performing a high-throughput experiment, our measurements will be subject to biological variation (which we may be interested in) and technical variation (which we probably won’t be). Being able to control these factors and minimise biases is key to experimental design.
Confounding factors in our design may arise by accident, or might be caused by not considering all possible sources of variation:-
(image from Cancer Research UK Cambridge Institute course on Experimental Design)
We can also introduce so-called “batch-effects” by our choice of when samples are prepared for sequencing. Large experiments may necessitate multiple runs or batches, and we should try and minimize the possible impact of batches but including a good representation of each condition of interest in each batch.
(image from Cancer Research UK Cambridge Institute course on Experimental Design)
When planning next-generation sequencing experiments, you will also need to consider
- the type of sequencing (e.g. whole-genome, exome, RNA-seq)
- will largely be dictated by your biological question
- single-end or paired-end
- how many reads (10 Million? 20 Million?, 100 Million?)
Some recommendations on these questions and more are provided by the Cancer Research Uk Cambridge Institute Genomics Core. Often the sequencing vendor performing your experiment will have some default options available.
The vendor may not advise on the sample-size; how many samples you will be sequencing to address your biological hypothesis of interest. This is a complex question and is often influenced by practical and financial constraints. The Sheffield Bioinformatics Core is able to advise on this, and any of the other issues above. bioinformatics-core@sheffield.ac.uk
Where do the data in this tutorial come from?
The data for this tutorial are publicly-available human cell-lines downsampled to a few genomic regions of interest. The steps of the workflow that we illustrate in this workshop will be broadly applicable to various forms of sequencing analysis (e.g. exome-seq, whole-genome seq, RNA-seq). We will discuss the specific workflows in subsequent workshops, and explain how they deviate from this generic workflow.
Galaxy, and it’s limitations?
We are primarily using Galaxy as an educational tool to demonstrate the processes and workflows behind the analysis of NGS data. Due to it’s interface, it does not require any prior experience of programming or Bioinformatics. However, it is still possible to perform the same analyses as an experienced Bioinformatician would using the command-line.
It is worth bearing the following in-mind before planning to do your own Bioinformatics analysis using Galaxy
- Disk space; the free account entitles you to 250Gb. This might sound like a lot, but will quickly fill up unless you get into the habit of removing temporary files or data you no longer need.
- Queuing times; we are using a special queue for the workshop, but after the workshop you will be competing with other Galaxy users for available slots
- Server availability; the Galaxy servers may become unavailable for planned maintenance or due to other error
Section 1: Preparation
Ignore if you have already created a Galaxy account and uploaded the example data in a previous exercise
1. Register as a new user at Europen public Galaxy server
Make sure you check your email to activate your account
2. Use this link on November 29th to access a reserved queue
3. Import the data for the workshop.
We can going to import the fastq files for this experiment. This is a standard format for storing raw sequencing reads and their associated quality scores. However, as we will see, the representation of the quality scores has changed over time.
You can import the data by:
In the tool panel located on the left, under Basic Tools select Get Data > Upload File. Click on the Paste/Fetch data button on the bottom section of the pop-up window.
Upload the example data for this workshop by selecting the files example1_R1.fastq example1_R2.fastq,example2_R1.fastq and example2_R2.fastq. You don’t need to specify the file type or genome build. Galaxy should be able to make a reasonable guess.
You should now have these 2 files in your history:
example1_R1.fastq
example1_R2.fastq
example2_R1.fastq
example2_R2.fastq
Uploading large files
Galaxy recommend that large datasets (Gbs of data) are uploaded using FTP. Instructions for doing this can be found here:-
https://galaxyproject.org/ftp-upload/
N.B. If you are using the European server, replace usegalaxy.org with usegalaxy.eu when following the instructions
You will need an FTP program such as filezilla, which is free to download and available for Mac and Windows.
Quick tour of the Galaxy interface
The Galaxy homepage is divided into three panels
- List of available tools on the left
- Panel to view current tool options, or view output
- History; a record of the analyses you have performed
(image from a short introduction to Galaxy)
Viewing panel
When you have selected a tool that you would like to use, it’s options will appear in the main Viewing panel. The tool can be executed by using the Execute button. Some documentation on the tools and the expected outputs should also be found here. Once you click on Execute, a new entry (or entries) will be created in the history.
History
The History is Galaxy’s log of all the analyses you have performed. You should aim to have a separate history for each analysis you perform, and the history can be named to allow you to keep track of all your analyses.

Exercise: Rename the history for this workshop to “NGS Intro” (or similar)

The history will contain all the outputs that you have generated as part of your analysis. To inspect a particular output, you can click on the “eye” icon. We will do this shortly for the fastq files that we have just uploaded.
You may notice that as items are added to the history, the colour they are displayed in changes over time. There four possible colours
- Grey; the job is being held in a queue
- Orange; the job is currently being run
- Green; the job has completed successfully
- Red; the job failed. You will need to double-check the options and try again
There are several options add the top of the History panel to create a new History, View all current Histories and access other settings for the current History including deleting files that are no longer required. It is advisable to pay attention to the disk usage quota in the top right corner. At the moment, this will probably be showing Using 0%
Section 3: Quality assessment with FastQC
FastQC is a popular tool from Babraham Institute Bioinformatics Group used for quality assessment of sequencing data. Most Bioinformatics pipelines will use FastQC, or similar tools in the first stage of the analysis. The documentation for FastQC will help you to interpret the plots and stats produced by the tool. A traffic light system is used to alert the user’s attention to possible issues. 
- From the left hand tool panel in Galaxy, FASTA/FASTQ -> FastQC (Or using the Search tools box)
- Select all of the FASTQ files as input. Use the multiple datasets button to select more than one file. Hold the CTRL (Windows) or Command (Mac) key and then click on multiple files (See the above screenshot).
- Execute the tool. You do not need to change any of the options
- When the tool finishes running, you should have an HTML file in your History for each FASTQ file that you selected. Click on the “eye” icon to view the various quality metrics.
The most important image is whether the base quality decreases significantly over the length of the read

Good quality data should look something like:-

Accurate base calls are important as they make the alignment of our sequences easier. Particular downstream analyses such as identifying mutations will also be hampered by poor-quality base calls.
All is not lost if we observe poor quality bases towards the end of the read. There are a number of trimming options that we can use for NGS data, as we will see shortly.
It is also worth bearing in mind that the tool is blind to the particular type of sequencing you are performing (i.e. whole-genome, ChIP-seq, RNA-seq) and the organism being sequenced, so some warnings might be expected due to the nature of your experiment. For instance, there are known sequencing composition biases that can occur at the beginning of RNA-seq reads. So-called “warnings” or “errors” may be persistent for all the samples in your dataset, so it is worth comparing QC reports rather than looking at the QC of individual samples in isolation.
Aggregating QC reports with multiqc
For datasets with large numbers of fastq files, it may be useful to aggregate the individual reports into a single combined report.
- Under the tools section, select Quality Control -> MultiQC
- Make sure Which tool was used to generate logs is set to
FastQC
- In Results file, select the RawData results files that you have just generated
You should then be able to view the fastqc plots for all the fastq files on the same page.
The most common cause of errors are not selecting FastQC as the tool used to generate logs, and not selecting the RawData outputs.
Exercise: Use the multiqc tool to make a combined QC report for all files in the dataset. Does the quality appear to be consistent across the dataset?
Section 4: Trimming
It is common to observe a decrease in quality scores towards the end of the sequencing reads. This is due to the process of cleaving terminators and colors labels not being 100%, and errors accummulate as the run progresses.
We should be concerned about having too many low quality bases in our sequences. A low quality score means that we are less confident about the base that has been identified at a given position. Such errors might make our sequences more difficult to match to the reference genome (alignment; see the next section), or be mistaken for genuine differences from the reference genome.
One popular tool is called Trimmomatic
It has many trimming options, including a sliding window approach where the quality scores of N consecutive bases (4 is the default) are averaged. If that average falls below a pre-defined cut-off, the remainder of the read is discarded. We can apply this approach to our data as follows:-
- Find the
Trimmomatic tool in Galaxy
- Change Single-end or paired-end reads? to
Paired-end (two separate input file)
- Use the multiple selection button to select
example1_R1, example2_R1 as the R1/first of pair files and example1_R2, example2_R2 as the R2/second of pair files.
- Keep Select Trimmomatic operation to perform on
Sliding window trimming (SLIDINGWINDOW)
- Keep Number of bases to average across as
4
- Keep Average quality required as
20
- Click on + Insert Trimmomatic Operation
- Select
Drop reads below a specified length (MINLEN) from Select Trimmomatic operation to perform
- Keep the **Minimum length of reads to be kept as
20
- Execute
A total of 8 outputs are created and we are only interested in the outputs with paired in the name. The unpaired files contain reads that are discarded from the R1 file but not R2 (and vice-versa), so are not useful for downstead analysis where we assume we have sequenced in both directions.
Exercise: Rename the paired trimmomatic output for the input files to
- example1_R1_trimmed.fastq
- example1_R2_trimmed.fastq
- example2_R1_trimmed.fastq
- example2_R1_trimmed.fastq
(Optional) If you have time, re-run FastQC on these trimmed files. What differences do you see?
Section 5: Alignment
We don’t really spend much time look at fastq files, as most of our time is spent with aligned reads. i.e. we have used some software to tell us whereabouts in the genome each read belongs to. This will usually be performed for you as part of a sequencing service, but it is good to get an appreciation of the steps involved.
In this section we map the reads in our FASTQ files to a reference genome. This figure from the Galaxy Training Network illustrates the procedure for three reads that map at positions 100, 114 and 123 of a reference genome

A plethora of different tools have been written to perform this task, and we will not describe it in detail. Alignment relies on the reference genome being indexed so that the sequencing reads can be located more efficiently. The genome index is a highly-accessible data structure, and Galaxy includes indices for many popular genomes.
1.Align the example files

- Find the tool Mapping -> Map with BWA
- alternatively, type
bwa in the search box
- In Select input type? Select Paired-fastq
- Use
example1_R1_trimmed.fastq, example2_R1_trimmed.fastq and example1_R2_trimmed.fastq, example2_R2_trimmed.fastq as the first and second set of reads respectively.
- Make sure the reference genome is set to Human Dec. 2013 (GRCh38/hg38) (hg38)
- Press Execute
- Wait!
The result will be a .bam file that we will describe in the next section. This file is not usually human-readable, as it is compressed. However, Galaxy is able to display the contents.
2. View the alignments
- Click on the eye of the resulting file to view the alignments.

The .sam / .bam file
The first part of the header lists the names (SN) of the sequences (chromosomes) used in alignment, their length (LN) and sometimes a md5sum “digital fingerprint” of the .fasta file used for alignment (M5).
@HD VN:1.3 SO:coordinate
@SQ SN:chr1 LN:248956422
@SQ SN:chr10 LN:133797422
@SQ SN:chr11 LN:135086622
@SQ SN:chr11_KI270721v1_random LN:100316
@SQ SN:chr12 LN:133275309
@SQ SN:chr13 LN:114364328
.....
.....
We also have a section where we can record the processing steps used to derive the file
@PG ID:bwa PN:bwa VN:0.7.17-r1188 CL:bwa sampe /data/db/data_managers/hg38/bwa_mem_index/hg38/hg38.fa first.sai second.sai /data/dnb03/galaxy_db/files/f/9/3/dataset_f9387692-2b3f-49c9-8228-d7309300ed28.dat /data/dnb03/galaxy_db/files/d/0/c/dataset_d0c79616-35a9-4b4d-a0e4-35a7ad74737b.dat"
....
....
Next is a tab-delimited section that describes the alignment of each sequence in detail.
D0ENMACXX111207:2:2103:9825:158567 99 chr1 169176747 60 101M = 169176962 316 AATTGGGCATTCTTCAGAAGGATGAGCTCAACTAAAAAAGAAGAGTCAGAAAAATCTCTTAACTCACTTTTATATAAATTACTTAGTATTTTAGCAAAAAC CCCFFFFFHAHHHJJIJJJJJJJJJJJJJJJJJJJJJJJJJJJIIBFHIIIJJIIIJJJJJJJJJIJJHHHHHFFFFFFFDEEEEEADEEEEEDDDDDDDD XT:A:U NM:i:0 SM:i:37 AM:i:37 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:101`
| 1 |
QNAME |
Sequence ID |
| 2 |
FLAG |
Sequence quality expressed as a bitwise flag |
| 3 |
RNAME |
Chromosome |
| 4 |
POS |
Start Position |
| 5 |
MAPQ |
Mapping Quality |
| 6 |
CIGAR |
Describes positions of matches, insertions, deletions w.r.t reference |
| 7 |
RNEXT |
Ref. name of mate / next read |
| 8 |
PNEXT |
Position of mate / next read |
| 9 |
TLEN |
Observed Template length |
| 10 |
SEQ |
Sequence |
| 11 |
QUAL |
Base Qualities |
There can also be all manner of optional tags as extra columns introduce by an aligner or downstream analysis tool. A common use is the RG tag which refers back to the read groups in the header.
Sorting and indexing
You will notice from the 3rd column that the reads are ordered according to their start position; whereas the reads in the fastq file were arranged in order that they were generated on the flow cell. By default, bwa-mem produces a bam where the reads are in the same order as the fastq. However, this is rather inconvenient for analysis where we require reads from the same location to be next to each other in the file.
An additional couple of steps have been performed after bwa-mem; sorting the file according to genome position and producing an index file. The index file does not provide any useful information for us and cannot be viewed in Galaxy. However, we will need it later on when viewing the data in IGV.
Quality Flags
The “flags” in the sam file can represent useful QC information
- Read is unmapped
- Read is paired / unpaired
- Read failed QC
- Read is a PCR duplicate (see later)
The combination of any of these properties is used to derive a numeric value
Derivation
There is a set of properties that a read can possess. If a particular property is observed, a corresponding power of 2 is added multiplied by 1. The final value is derived by summing all the powers of 2.

| 69 (= 1 + 4 + 64) |
The read is paired, is the first read in the pair, and is unmapped. |
| 77 (= 1 + 4 + 8 + 64) |
The read is paired, is the first read in the pair, both are unmapped. |
| 83 (= 1 + 2 + 16 + 64) |
The read is paired, mapped in a proper pair, is the first read in the pair, and it is mapped to the reverse strand. |
| 99 (= 1 + 2 + 32 + 64) |
The read is paired, mapped in a proper pair, is the first read in the pair, and its mate is mapped to the reverse strand. |
| 133 (= 1 + 4 + 128) |
The read is paired, is the second read in the pair, and it is unmapped. |
| 137 (= 1 + 8 + 128) |
The read is paired, is the second read in the pair, and it is mapped while its mate is not. |
| 141 (= 1 + 4 + 8 + 128) |
The read is paired, is the second read in the pair, but both are unmapped. |
| 147 (= 1 + 2 + 16 + 128) |
The read is paired, mapped in a proper pair, is the second read in the pair, and mapped to the reverse strand. |
| 163 (= 1 + 2 + 32 + 128) |
The read is paired, mapped in a proper pair, is the second read in the pair, and its mate is mapped to the reverse strand. |
See also
Have a CIGAR!
The CIGAR (Compact Idiosyncratic Gapped Alignment Report) string is a way of encoding the match between a given sequence and the position it has been assigned in the genome. It is comprised by a series of letters and numbers to indicate how many consecutive bases have that mapping.
| M |
alignment match |
| I |
insertion |
| D |
deletion |
| N |
skipped |
| S |
soft-clipping |
| H |
hard-clipping |
e.g.
68M
- 68 bases matching the reference
1S67M
- 1 soft-clipped read followed by 67 matches
15M87N70M90N16M
- 15 matches following by 87 bases skipped followed by 70 matches etc.
3. Check the alignment stats
We will now generate a few basic statistics about the alignment of our data; such as the total number of reads and how many were aligned. In the case of paired-end data, it will also tell you how many pairs were within the expected distance of each other and located on the same chromosome.
- Select the tool SAM/BAM:- > Samtools flagstat
- In the BAM File to report statistics of box choose the bam file(s) produced by
bwa.
The tool will also report how many PCR Duplicates have been found in the data. But as we haven’t yet run any software to identify such reads, the flagstat output will show 0 reads.
- Find the tool SAM/BAM -> Samtools idxstats
- In the BAM file dropdown select the bam file produced by
bwa
The output of this tool will tell you how many reads aligned to each chromosome in your reference genome.
About Duplicates
The preparation of a sequencing library requires PCR amplification of your starting material. This can lead to some DNA fragments being over-represented in your data. As our DNA fragments are formed in a random process, and relatively small compared to the number of bases to be sequenced from the genome (3Gb in humans), we tend to think the two DNA fragments that have identical starting and ending position are unlikely to have occurred due to chance. Some software, such as Picard will identify such artefacts and mark them for attention by downstream methods. i.e. they are not completely discarded from the analysis.

4. Mark Duplicates with Picard
- Use the tool Picard -> MarkDuplicates
- In Select SAM/BAM dataset or dataset collection choose the bam file(s) produced by bwa-mem.
Exercise: Use the MarkDuplicates tool to identify PCR duplicates in the bam file(s). View the bam files and scroll through the data. Can you find any reads that have been identified as duplicates? You can use their “flag” or aligned coordinates to find them.
Warning the assumption about reads having the same start location being PCR duplicates falls down when we do sequencing for a very specific region of the genome. e.g. targeted sequencing from a panel of cancer genes. Running a tool to mark PCR duplicates on such data would recommend a high proportion of reads be ignored from further analysis.
5. (Optional) Re-run the alignment statistics
- Select the tool SAM/BAM -> Samtools flagstat
- In the BAM File to report statistics of box choose the bam file produced by the mark duplicates step
6. Download your bam file(s)
For the next step you will need to download the bam files that you produced. To do this, you can click the floppy disk icon.

Make sure that you click both Download dataset and Download bam_index
Section 5. Visualising the aligned reads with IGV
Whilst Bioinformatics tools are very powerful and allow you to perform statistical analyses and test hypotheses, there is no substitute for looking at and exploring the data. A trained-eye can quite quickly get a sense of the data quality before any computational analyses have been run. Furthermore, as the person requesting the sequencing, you probably know a lot about the biological context of the samples and what to expect.
We will load the aligned reads that we have just created into IGV and start to get a feel for the process of variant calling
- Download IGV
You can download IGV for Windows using this link
If you are unable to download IGV, you should be able to run a web-app from the Broad Institute website with the same functionality.
https://igv.org/app/
- Load a reference Genome and some Data Tracks
By default, IGV will load with the last genome that you used. It is essential that you use the same genome version that the reads were aligned to; in our case hg38. You can check / change the genome by clicking the drop-down menu in the upper-left

We can also load extra tracks into the browser that can help us understand our variant calls. For example, we can load data from dbSNP which will tell us about common mutations that already been identified. These can be loaded via File -> Load from Server.. and selecting dbSNP 1.4.7 from the Variation and Repeats section

- Navigate around IGV
When IGV loads up we start with a very high-level view of the genome where all chromosomes are visible. Such a view might be useful if we were interested in large copy-number variation across a cohort of samples. However, we are mostly interested in changes at the individual base-level which is not possible to view at this resolution. We need to navigate to a particular region of interest.
Alongside the drop-down menu used to change the genome, there is a drop-down menu to select a particular chromosome and a box where we can enter text. Inside the text box we can enter a particular genome interval of interest
e.g. chr1:10,000-11,000
IGV should now be displaying a region on chromosome 1 from base position 10,000 to 11,000.

At this resolution, we can start to see the genome sequence. Each DNA base is represented by a different colour (A = green, C = blue) and it seems that this region is highly-repetitive; comprising mostly C bases. We can zoom further in using the zoom control in the top right of IGV

We can use the zoom control, and also move along the genome by holding down by mouse button and sliding left-and-right, to navigate to whatever genomic location we want. If we known the name of the gene we want to interrogate we can navigate directly there using the text box

The text box should now update to show the coordinates of ADGRE2 (chr19:....). At the bottom of the screen we can now see the gene model for the gene ADGRE2. Genes are represented as lines and boxes. Lines represent intronic regions and boxes represent exonic regions. The arrows indicate the direction / strand of transcription for the gene.

- Load the aligned reads
Choose File > Load from File…, select the bam file that you downloaded from Galaxy, and click OK. Note that the bam and index files must be in the same directory for IGV to load these properly.
The main display of IGV should now update to hold tracks for the aligned reads from this bam file. It may seem like nothing is being displayed. This is because we are zoomed-out too far to be able to see the reads. Use the zoom function and move along the genome until you start to see some (mostly) grey rectangles. These are the aligned reads.
If you hover over a particular read, how will see columns from the bam file being displayed such as the mapping quality and information about the paired reads.
Coloured-letters within the read indicate bases that are different to the reference genome. The entire read may be coloured differently to grey, which can indicate different things depending on how the display has been configured. For example, it can highlight paired-reads with an insert size different to that expected (see here) or reads with low quality. The display of aligned reads can be configured through the menus, as described here.
Summary
The process we have just followed is summarised in the workflow.

As part of this workshop series, there will now be sessions on variant-calling and RNA-seq.
We will not cover ChIP-seq or methylation. If you are interested these topics you can check out the resources from the Galaxy Training Network
LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIE5HUyBkYXRhIgphdXRob3I6ICJNYXJrIER1bm5pbmcgLSBTaGVmZmllbGQgQmlvaW5mb3JtYXRpY3MgQ29yZSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNzczogc3R5bGVzaGVldHMvc3R5bGVzLmNzcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgo8aW1nIHNyYz0ibWVkaWEvbG9nby1zbS5wbmciIGFsaWduPXJpZ2h0PgoKd2ViIDogW3NiYy5zaGVmLmFjLnVrXShodHRwOi8vc2JjLnNoZWYuYWMudWspICAKdHdpdHRlcjogW1NoZWZmQmlvaW5mQ29yZV0oaHR0cHM6Ly90d2l0dGVyLmNvbS9TaGVmZkJpb2luZkNvcmUpICAKZW1haWw6IFtiaW9pbmZvcm1hdGljcy1jb3JlQHNoZWZmaWVsZC5hYy51a10oYmlvaW5mb3JtYXRpY3MtY29yZUBzaGVmZmllbGQuYWMudWspCgotLS0tLQoKIyBUdXRvcmlhbCBPdmVydmlldyBhbmQgQmFja2dyb3VuZAoKVGhpcyB0dXRvcmlhbCB3aWxsIGNvdmVyIHRoZSBiYXNpY3Mgb2YgTkdTIGFuYWx5c2lzIHVzaW5nIEdhbGF4eTsgYSBvcGVuLXNvdXJjZSB3ZWItYmFzZWQgcGxhdGZvcm0gZm9yIHRoZSBhbmFseXNpcyBvZiBiaW9sb2dpY2FsIGRhdGEuIFlvdSBzaG91bGQgZ2FpbiBhbiBhcHByZWNpYXRpb24gb2YgdGhlIHRhc2tzIGludm9sdmVkIGluIGEgdHlwaWNhbCBOR1MgYW5hbHlzaXMgYW5kIGJlIGNvbWZvcnRhYmxlIHdpdGggdGhlIG91dHB1dHMgZ2VuZXJhdGVkIGJ5IGEgc2VxdWVuY2luZyBzZXJ2aWNlLiBZb3Ugd2lsbCBhbHNvIHVzZSB0aGUgSW50ZWdyYXRpdmUgR2Vub21pY3MgVmlld2VyIChJR1YpIHRvICp2aWV3KiBzb21lIG9mIHRoZSBkYXRhIHdlIGdlbmVyYXRlIGluIGFuIGludGVyYWN0aXZlIG1hbm5lci4KClBhcnRzIG9mIHRoaXMgdHV0b3JpYWwgYXJlIGJhc2VkIG9uIHRoZSB0dXRvcmlhbHMgZnJvbSB0aGUgR2FsYXh5IFRyYWluaW5nIE5ldHdvcmsKCi0gW0dhbGF4eSBUcmFpbmluZyBOZXR3b3JrXShodHRwczovL3RyYWluaW5nLmdhbGF4eXByb2plY3Qub3JnL3RyYWluaW5nLW1hdGVyaWFsLykKCldlIHdpbGwgYmUgdXNpbmcgSWxsdW1pbmEgc2hvcnQtcmVhZCBzZXF1ZW5jaW5nIGFzIG91ciB0ZWNobm9sb2d5IG9mIGludGVyZXN0LCBhcyBpdCBpcyBieSBmYXIgdGhlIHByZXZhbGVudCB0eXBlIG9mIGRhdGEgYXZhaWxhYmxlLiAKCiMjIFVzaW5nIHRoZXNlIG5vdGVzCgo8ZGl2IGNsYXNzPSJleGVyY2lzZSI+ClNlY3Rpb25zIHdpdGggdGhpcyBiYWNrZ3JvdW5kIGluZGljYXRlIGV4ZXJjaXNlcyB0byBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoZSB3b3Jrc2hvcC4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+ClNlY3Rpb25zIHdpdGggdGhpcyBiYWNrZ3JvdW5kIGhpZ2hsaWdodCBwYXJ0aWN1bGFyIHNob3J0Y3V0cyBvciBvdGhlciByZWZlcmVuY2VzIHRoYXQgbWlnaHQgYmUgdXNlZnVsLgo8L2Rpdj4KCjxkaXYgY2xhc3M9Indhcm5pbmciPgpTZWN0aW9ucyB3aXRoIHRoaXMgYmFja2dyb3VuZCBnaXZlIGluZm9ybWF0aW9uIGFib3V0IHBvdGVudGlhbCBlcnJvciBtZXNzYWdlcyB5b3UgbWlnaHQgZW5jb3VudGVyLCBvciBwcm9ibGVtcyB0aGF0IG1pZ2h0IGFyaXNlIGluIHlvdXIgb3duIGRhdGEgYW5hbHlzaXMuCjwvZGl2PgoKLS0tLS0KCkEgc2hvcnQgaW50cm9kdWN0aW9uIHRvIE5leHQgR2VuZXJhdGlvbiBTZXF1ZW5jaW5nIGNhbiBiZSBmb3VuZCBpbiB0aGlzIHlvdXR1YmUgdmlkZW8KCi0gW05leHQgR2VuZXJhdGlvbiBTZXF1ZW5jaW5nIChJbGx1bWluYSkgQW4gSW50cm9kdWN0aW9uIC0gSGVucmlrJ3MgTGFiXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUNaZU4tSWdqWUNvKQoKVGhlIG92ZXJhbGwgd29ya2Zsb3cgdXNlZCBpbiB0aGUgdHV0b3JpYWwgaXMgc3VtbWFyaXNlZCBiZWxvdzotCgo8aW1nIHNyYz0ibWVkaWEvb3ZlcmFsbF93b3JrZmxvdy5wbmciLz4KCiMjIEV4cGVyaW1lbnRhbCBEZXNpZ24KCkJlZm9yZSBlbWJhcmtpbmcgb24gYW55IGhpZ2gtdGhyb3VnaHB1dCBleHBlcmltZW50LCBpdCBpcyBpbXBvcnRhbnQgdG8gcGF5IGR1ZSBhdHRlbnRpb24gdG8gdGhlICpleHBlcmltZW50YWwgZGVzaWduKi4gVGhpcyBmYW1vdXMgcXVvdGUgZnJvbSB0aGUgc3RhdGlzdGljaWFuIFIuQSBGaXNoZXIgaW4gdGhlIDE5MzggaXMgc3RpbGwgYXBwbGljYWJsZSB0byBtb2Rlcm4gdGVjaG5vbG9naWVzCgo+ICoqVG8gY2FsbCBpbiB0aGUgc3RhdGlzdGljaWFuIGFmdGVyIHRoZSBleHBlcmltZW50IGlzIGRvbmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBhc2tpbmcgaGltIHRvIHBlcmZvcm0gYSBwb3N0bW9ydGVtIGV4YW1pbmF0aW9uOiBoZSBtYXkgYmUgYWJsZSB0byBzYXkgd2hhdCB0aGUgZXhwZXJpbWVudCBkaWVkIG9mLioqCgpFeHBlcmltZW50YWwgRGVzaWduIGVuY29tcGFzc2VzIHF1ZXN0aW9ucyBzdWNoIGFzCgotIHdoaWNoIGNvbnRyb2xzIHRvIHVzZT8KICAtIHBvc2l0aXZlIC8gbmVnYXRpdmUgY29udHJvbHMKICAtIGhlYWx0aHkgY29udHJvbHMKLSB3aGF0IGV4cGVyaW1lbnRhbCBjb25kaXRpb25zPwotIHdoYXQgdGVjaG5pY2FsIGFuZCBiaW9sb2dpY2FsIGZhY3RvcnMgYXJlIHByZXNlbnQ/CgpXaGVuIHBlcmZvcm1pbmcgYSBoaWdoLXRocm91Z2hwdXQgZXhwZXJpbWVudCwgb3VyIG1lYXN1cmVtZW50cyB3aWxsIGJlIHN1YmplY3QgdG8gYmlvbG9naWNhbCB2YXJpYXRpb24gKHdoaWNoIHdlIG1heSBiZSBpbnRlcmVzdGVkIGluKSBhbmQgdGVjaG5pY2FsIHZhcmlhdGlvbiAod2hpY2ggd2UgcHJvYmFibHkgd29uJ3QgYmUpLiBCZWluZyBhYmxlIHRvIGNvbnRyb2wgdGhlc2UgZmFjdG9ycyBhbmQgbWluaW1pc2UgYmlhc2VzIGlzIGtleSB0byBleHBlcmltZW50YWwgZGVzaWduLgoKQ29uZm91bmRpbmcgZmFjdG9ycyBpbiBvdXIgZGVzaWduIG1heSBhcmlzZSBieSBhY2NpZGVudCwgb3IgbWlnaHQgYmUgY2F1c2VkIGJ5IG5vdCBjb25zaWRlcmluZyBhbGwgcG9zc2libGUgc291cmNlcyBvZiB2YXJpYXRpb246LQoKPGltZyBzcmM9Im1lZGlhL2NvbmZvdW5kaW5nX2ZhY3Rvci5QTkciLz4KKGltYWdlIGZyb20gQ2FuY2VyIFJlc2VhcmNoIFVLIENhbWJyaWRnZSBJbnN0aXR1dGUgY291cnNlIG9uIEV4cGVyaW1lbnRhbCBEZXNpZ24pCgpXZSBjYW4gYWxzbyBpbnRyb2R1Y2Ugc28tY2FsbGVkICJiYXRjaC1lZmZlY3RzIiBieSBvdXIgY2hvaWNlIG9mIHdoZW4gc2FtcGxlcyBhcmUgcHJlcGFyZWQgZm9yIHNlcXVlbmNpbmcuIExhcmdlIGV4cGVyaW1lbnRzIG1heSBuZWNlc3NpdGF0ZSBtdWx0aXBsZSBydW5zIG9yIGJhdGNoZXMsIGFuZCB3ZSBzaG91bGQgdHJ5IGFuZCBtaW5pbWl6ZSB0aGUgcG9zc2libGUgaW1wYWN0IG9mIGJhdGNoZXMgYnV0IGluY2x1ZGluZyBhIGdvb2QgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBjb25kaXRpb24gb2YgaW50ZXJlc3QgaW4gZWFjaCBiYXRjaC4KCjxpbWcgc3JjPSJtZWRpYS9ibG9ja2luZy5QTkciLz4KKGltYWdlIGZyb20gQ2FuY2VyIFJlc2VhcmNoIFVLIENhbWJyaWRnZSBJbnN0aXR1dGUgY291cnNlIG9uIEV4cGVyaW1lbnRhbCBEZXNpZ24pCgpXaGVuIHBsYW5uaW5nIG5leHQtZ2VuZXJhdGlvbiBzZXF1ZW5jaW5nIGV4cGVyaW1lbnRzLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gY29uc2lkZXIKCi0gdGhlIHR5cGUgb2Ygc2VxdWVuY2luZyAoZS5nLiB3aG9sZS1nZW5vbWUsIGV4b21lLCBSTkEtc2VxKQogICsgd2lsbCBsYXJnZWx5IGJlIGRpY3RhdGVkIGJ5IHlvdXIgYmlvbG9naWNhbCBxdWVzdGlvbgotIHNpbmdsZS1lbmQgb3IgcGFpcmVkLWVuZAotIGhvdyBtYW55IHJlYWRzICgxMCBNaWxsaW9uPyAyMCBNaWxsaW9uPywgMTAwIE1pbGxpb24/KQoKU29tZSByZWNvbW1lbmRhdGlvbnMgb24gdGhlc2UgcXVlc3Rpb25zIGFuZCBtb3JlIGFyZSBwcm92aWRlZCBieSB0aGUgW0NhbmNlciBSZXNlYXJjaCBVayBDYW1icmlkZ2UgSW5zdGl0dXRlIEdlbm9taWNzIENvcmVdKGh0dHBzOi8vd3d3LmNydWsuY2FtLmFjLnVrL2NvcmUtZmFjaWxpdGllcy9nZW5vbWljcy1jb3JlL3NlcXVlbmNpbmcpLiBPZnRlbiB0aGUgc2VxdWVuY2luZyB2ZW5kb3IgcGVyZm9ybWluZyB5b3VyIGV4cGVyaW1lbnQgd2lsbCBoYXZlIHNvbWUgZGVmYXVsdCBvcHRpb25zIGF2YWlsYWJsZS4KClRoZSB2ZW5kb3IgbWF5IG5vdCBhZHZpc2Ugb24gdGhlICpzYW1wbGUtc2l6ZSo7IGhvdyBtYW55IHNhbXBsZXMgeW91IHdpbGwgYmUgc2VxdWVuY2luZyB0byBhZGRyZXNzIHlvdXIgYmlvbG9naWNhbCBoeXBvdGhlc2lzIG9mIGludGVyZXN0LiBUaGlzIGlzIGEgY29tcGxleCBxdWVzdGlvbiBhbmQgaXMgb2Z0ZW4gaW5mbHVlbmNlZCBieSBwcmFjdGljYWwgYW5kIGZpbmFuY2lhbCBjb25zdHJhaW50cy4gVGhlIFNoZWZmaWVsZCBCaW9pbmZvcm1hdGljcyBDb3JlIGlzIGFibGUgdG8gYWR2aXNlIG9uIHRoaXMsIGFuZCBhbnkgb2YgdGhlIG90aGVyIGlzc3VlcyBhYm92ZS4gYGJpb2luZm9ybWF0aWNzLWNvcmVAc2hlZmZpZWxkLmFjLnVrYAoKCgojIyBXaGVyZSBkbyB0aGUgZGF0YSBpbiB0aGlzIHR1dG9yaWFsIGNvbWUgZnJvbT8KClRoZSBkYXRhIGZvciB0aGlzIHR1dG9yaWFsIGFyZSBwdWJsaWNseS1hdmFpbGFibGUgaHVtYW4gY2VsbC1saW5lcyAqZG93bnNhbXBsZWQqIHRvIGEgZmV3IGdlbm9taWMgcmVnaW9ucyBvZiBpbnRlcmVzdC4gVGhlIHN0ZXBzIG9mIHRoZSB3b3JrZmxvdyB0aGF0IHdlIGlsbHVzdHJhdGUgaW4gdGhpcyB3b3Jrc2hvcCB3aWxsIGJlIGJyb2FkbHkgYXBwbGljYWJsZSB0byB2YXJpb3VzIGZvcm1zIG9mIHNlcXVlbmNpbmcgYW5hbHlzaXMgKGUuZy4gZXhvbWUtc2VxLCB3aG9sZS1nZW5vbWUgc2VxLCBSTkEtc2VxKS4gV2Ugd2lsbCBkaXNjdXNzIHRoZSBzcGVjaWZpYyB3b3JrZmxvd3MgaW4gc3Vic2VxdWVudCB3b3Jrc2hvcHMsIGFuZCBleHBsYWluIGhvdyB0aGV5IGRldmlhdGUgZnJvbSB0aGlzIGdlbmVyaWMgd29ya2Zsb3cuCgoKIyMgR2FsYXh5LCBhbmQgaXQncyBsaW1pdGF0aW9ucz8KCldlIGFyZSBwcmltYXJpbHkgdXNpbmcgR2FsYXh5IGFzIGFuIGVkdWNhdGlvbmFsIHRvb2wgdG8gZGVtb25zdHJhdGUgdGhlIHByb2Nlc3NlcyBhbmQgd29ya2Zsb3dzIGJlaGluZCB0aGUgYW5hbHlzaXMgb2YgTkdTIGRhdGEuIER1ZSB0byBpdCdzIGludGVyZmFjZSwgaXQgZG9lcyBub3QgcmVxdWlyZSBhbnkgcHJpb3IgZXhwZXJpZW5jZSBvZiBwcm9ncmFtbWluZyBvciBCaW9pbmZvcm1hdGljcy4gSG93ZXZlciwgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgc2FtZSBhbmFseXNlcyBhcyBhbiBleHBlcmllbmNlZCBCaW9pbmZvcm1hdGljaWFuIHdvdWxkIHVzaW5nIHRoZSBjb21tYW5kLWxpbmUuIAoKSXQgaXMgd29ydGggYmVhcmluZyB0aGUgZm9sbG93aW5nIGluLW1pbmQgYmVmb3JlIHBsYW5uaW5nIHRvIGRvIHlvdXIgb3duIEJpb2luZm9ybWF0aWNzIGFuYWx5c2lzIHVzaW5nIEdhbGF4eQoKLSBEaXNrIHNwYWNlOyB0aGUgZnJlZSBhY2NvdW50IGVudGl0bGVzIHlvdSB0byAyNTBHYi4gVGhpcyBtaWdodCBzb3VuZCBsaWtlIGEgbG90LCBidXQgd2lsbCBxdWlja2x5IGZpbGwgdXAgdW5sZXNzIHlvdSBnZXQgaW50byB0aGUgaGFiaXQgb2YgcmVtb3ZpbmcgdGVtcG9yYXJ5IGZpbGVzIG9yIGRhdGEgeW91IG5vIGxvbmdlciBuZWVkLgotIFF1ZXVpbmcgdGltZXM7IHdlIGFyZSB1c2luZyBhIHNwZWNpYWwgcXVldWUgZm9yIHRoZSB3b3Jrc2hvcCwgYnV0IGFmdGVyIHRoZSB3b3Jrc2hvcCB5b3Ugd2lsbCBiZSBjb21wZXRpbmcgd2l0aCBvdGhlciBHYWxheHkgdXNlcnMgZm9yIGF2YWlsYWJsZSBzbG90cwotIFNlcnZlciBhdmFpbGFiaWxpdHk7IHRoZSBHYWxheHkgc2VydmVycyBtYXkgYmVjb21lIHVuYXZhaWxhYmxlIGZvciBwbGFubmVkIG1haW50ZW5hbmNlIG9yIGR1ZSB0byBvdGhlciBlcnJvcgoKIyBTZWN0aW9uIDE6IFByZXBhcmF0aW9uIAoKKipJZ25vcmUgaWYgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkIGEgR2FsYXh5IGFjY291bnQgYW5kIHVwbG9hZGVkIHRoZSBleGFtcGxlIGRhdGEgaW4gYSBwcmV2aW91cyBleGVyY2lzZSoqCgojIyMjIDEuICBSZWdpc3RlciBhcyBhIG5ldyB1c2VyIGF0IEV1cm9wZW4gcHVibGljIEdhbGF4eSBzZXJ2ZXIKCi0gaHR0cHM6Ly91c2VnYWxheHkuZXUKCioqTWFrZSBzdXJlIHlvdSBjaGVjayB5b3VyIGVtYWlsIHRvIGFjdGl2YXRlIHlvdXIgYWNjb3VudCoqCgojIyMjIDIuIFVzZSB0aGlzIGxpbmsgb24gTm92ZW1iZXIgMjl0aCB0byBhY2Nlc3MgYSByZXNlcnZlZCBxdWV1ZQoKLSBbaHR0cHM6Ly91c2VnYWxheHkuZXUvam9pbi10cmFpbmluZy9zYmNnYWxheHktMjAyMS0xMS0yOV0oaHR0cHM6Ly91c2VnYWxheHkuZXUvam9pbi10cmFpbmluZy9zYmNnYWxheHktMjAyMS0xMS0yOSkKCiMjIyMgMy4gIEltcG9ydCB0aGUgZGF0YSBmb3IgdGhlIHdvcmtzaG9wLgoKV2UgY2FuIGdvaW5nIHRvIGltcG9ydCB0aGUgWypmYXN0cSogZmlsZXNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZBU1RRX2Zvcm1hdCkgZm9yIHRoaXMgZXhwZXJpbWVudC4gVGhpcyBpcyBhIHN0YW5kYXJkIGZvcm1hdCBmb3Igc3RvcmluZyByYXcgc2VxdWVuY2luZyByZWFkcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBxdWFsaXR5IHNjb3Jlcy4gSG93ZXZlciwgYXMgd2Ugd2lsbCBzZWUsIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVhbGl0eSBzY29yZXMgaGFzIGNoYW5nZWQgb3ZlciB0aW1lLgoKWW91IGNhbiBpbXBvcnQgdGhlIGRhdGEgYnk6CgoxLiAgSW4gdGhlIHRvb2wgcGFuZWwgbG9jYXRlZCBvbiB0aGUgbGVmdCwgdW5kZXIgQmFzaWMgVG9vbHMgc2VsZWN0ICoqR2V0CiAgICBEYXRhID4gVXBsb2FkIEZpbGUqKi4gQ2xpY2sgb24gdGhlICoqUGFzdGUvRmV0Y2ggZGF0YSoqIGJ1dHRvbiBvbiB0aGUKICAgIGJvdHRvbSBzZWN0aW9uIG9mIHRoZSBwb3AtdXAgd2luZG93LgoyLiAgVXBsb2FkIHRoZSBleGFtcGxlIGRhdGEgZm9yIHRoaXMgd29ya3Nob3AgYnkgc2VsZWN0aW5nIHRoZSBmaWxlcyBgZXhhbXBsZTFfUjEuZmFzdHFgIGBleGFtcGxlMV9SMi5mYXN0cWAsYGV4YW1wbGUyX1IxLmZhc3RxYCBhbmQgYGV4YW1wbGUyX1IyLmZhc3RxYC4gWW91IGRvbid0IG5lZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSB0eXBlIG9yIGdlbm9tZSBidWlsZC4gR2FsYXh5IHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzLgoKCjMuICBZb3Ugc2hvdWxkIG5vdyBoYXZlIHRoZXNlIDIgZmlsZXMgaW4geW91ciBoaXN0b3J5OgogICAgLSBgZXhhbXBsZTFfUjEuZmFzdHFgCiAgICAtIGBleGFtcGxlMV9SMi5mYXN0cWAKICAgIC0gYGV4YW1wbGUyX1IxLmZhc3RxYAogICAgLSBgZXhhbXBsZTJfUjIuZmFzdHFgCgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+CllvdSBtaWdodCBzb21ldGltZXMgc2VlIGEgYC5nemAgYXQgdGhlIGVuZCBvZiBhIGZhc3RxIGZpbGUgbmFtZS4gVGhpcyBtZWFucyB0aGF0IGl0IGlzICpjb21wcmVzc2VkKiAobGlrZSBhIHppcCBmaWxlKS4gVGhlIGZhc3RxIGZpbGVzIGFyZSBzb21ldGltZXMgY2FsbGVkIGAuZnFgIG9yIGAuZnEuZ3pgLCBidXQgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSB0aGUgc2FtZS4KPC9kaXY+CgojIyMgVXBsb2FkaW5nIGxhcmdlIGZpbGVzCgo8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4KR2FsYXh5IHJlY29tbWVuZCB0aGF0IGxhcmdlIGRhdGFzZXRzIChHYnMgb2YgZGF0YSkgYXJlIHVwbG9hZGVkIHVzaW5nICpGVFAqLiBJbnN0cnVjdGlvbnMgZm9yIGRvaW5nIHRoaXMgY2FuIGJlIGZvdW5kIGhlcmU6LQoKaHR0cHM6Ly9nYWxheHlwcm9qZWN0Lm9yZy9mdHAtdXBsb2FkLwoKKipOLkIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIEV1cm9wZWFuIHNlcnZlciwgcmVwbGFjZSBgdXNlZ2FsYXh5Lm9yZ2Agd2l0aCBgdXNlZ2FsYXh5LmV1YCB3aGVuIGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zKioKCllvdSB3aWxsIG5lZWQgYW4gRlRQIHByb2dyYW0gc3VjaCBhcyBbKmZpbGV6aWxsYSpdKGh0dHBzOi8vZmlsZXppbGxhLXByb2plY3Qub3JnLyksIHdoaWNoIGlzIGZyZWUgdG8gZG93bmxvYWQgYW5kIGF2YWlsYWJsZSBmb3IgTWFjIGFuZCBXaW5kb3dzLiAKCgo8L2Rpdj4KCiMjIFF1aWNrIHRvdXIgb2YgdGhlIEdhbGF4eSBpbnRlcmZhY2UKClRoZSBHYWxheHkgaG9tZXBhZ2UgaXMgZGl2aWRlZCBpbnRvIHRocmVlIHBhbmVscwoKLSBMaXN0IG9mIGF2YWlsYWJsZSB0b29scyBvbiB0aGUgbGVmdAotIFBhbmVsIHRvIHZpZXcgY3VycmVudCB0b29sIG9wdGlvbnMsIG9yIHZpZXcgb3V0cHV0Ci0gSGlzdG9yeTsgYSByZWNvcmQgb2YgdGhlIGFuYWx5c2VzIHlvdSBoYXZlIHBlcmZvcm1lZAoKPGltZyBzcmM9Imh0dHBzOi8vdHJhaW5pbmcuZ2FsYXh5cHJvamVjdC5vcmcvdHJhaW5pbmctbWF0ZXJpYWwvdG9waWNzL2ludHJvZHVjdGlvbi9pbWFnZXMvZ2FsYXh5X2ludGVyZmFjZS5wbmciLz4KKGltYWdlIGZyb20gW2Egc2hvcnQgaW50cm9kdWN0aW9uIHRvIEdhbGF4eV0oaHR0cHM6Ly90cmFpbmluZy5nYWxheHlwcm9qZWN0Lm9yZy90cmFpbmluZy1tYXRlcmlhbC90b3BpY3MvaW50cm9kdWN0aW9uL3R1dG9yaWFscy9nYWxheHktaW50cm8tc2hvcnQvdHV0b3JpYWwuaHRtbCkpCgojIyMgVG9vbHMKClRoZSB0b29scyBwYW5lbCBnaXZlcyBhY2Nlc3MgdG8gdGhlIG1hbnksIG1hbnkgZGlmZmVyZW50IHRvb2xzIHRoYXQgeW91IGJlIHJ1biB0aHJvdWdoIEdhbGF4eS4gVGhlIHRvb2xzIGFyZSBkaXZpZGVkIGludG8gZGlmZmVyZW50IHNlY3Rpb25zIHRvIG1ha2UgbmF2aWdhdGlvbiBlYXNpZXIuIElmIHlvdSBrbm93IHRoZSBuYW1lIG9mIHRoZSB0b29sIHlvdSB3YW50IHRvIHVzZSwgeW91IGNhbiBhbHNvIHNlYXJjaCBmb3IgaXQgaW4gdGhlIHRleHQgYm94LiBBIGxpc3Qgb2YgdG9vbHMgbWF0Y2hpbmcgdGhhdCBuYW1lIHdpbGwgYmUgc2hvd24uCgojIyMgVmlld2luZyBwYW5lbAoKV2hlbiB5b3UgaGF2ZSBzZWxlY3RlZCBhIHRvb2wgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UsIGl0J3Mgb3B0aW9ucyB3aWxsIGFwcGVhciBpbiB0aGUgbWFpbiBWaWV3aW5nIHBhbmVsLiBUaGUgdG9vbCBjYW4gYmUgZXhlY3V0ZWQgYnkgdXNpbmcgdGhlIEV4ZWN1dGUgYnV0dG9uLiBTb21lIGRvY3VtZW50YXRpb24gb24gdGhlIHRvb2xzIGFuZCB0aGUgZXhwZWN0ZWQgb3V0cHV0cyBzaG91bGQgYWxzbyBiZSBmb3VuZCBoZXJlLiBPbmNlIHlvdSBjbGljayBvbiBFeGVjdXRlLCBhIG5ldyBlbnRyeSAob3IgZW50cmllcykgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBoaXN0b3J5LgoKIyMjIEhpc3RvcnkKClRoZSBIaXN0b3J5IGlzIEdhbGF4eSdzIGxvZyBvZiBhbGwgdGhlIGFuYWx5c2VzIHlvdSBoYXZlIHBlcmZvcm1lZC4gWW91IHNob3VsZCBhaW0gdG8gaGF2ZSBhIHNlcGFyYXRlIGhpc3RvcnkgZm9yIGVhY2ggYW5hbHlzaXMgeW91IHBlcmZvcm0sIGFuZCB0aGUgaGlzdG9yeSBjYW4gYmUgbmFtZWQgdG8gYWxsb3cgeW91IHRvIGtlZXAgdHJhY2sgb2YgYWxsIHlvdXIgYW5hbHlzZXMuCgo8aW1nIHNyYz0iaHR0cHM6Ly90cmFpbmluZy5nYWxheHlwcm9qZWN0Lm9yZy90cmFpbmluZy1tYXRlcmlhbC9zaGFyZWQvaW1hZ2VzL3JlbmFtZV9oaXN0b3J5LnBuZyIvPgoKLS0tLS0KCjxkaXYgY2xhc3M9ImV4ZXJjaXNlIj4KCioqRXhlcmNpc2UqKjogUmVuYW1lIHRoZSBoaXN0b3J5IGZvciB0aGlzIHdvcmtzaG9wIHRvICJOR1MgSW50cm8iIChvciBzaW1pbGFyKQoKPC9kaXY+CgotLS0tLQoKPGltZyBzcmM9Imh0dHBzOi8vdHJhaW5pbmcuZ2FsYXh5cHJvamVjdC5vcmcvdHJhaW5pbmctbWF0ZXJpYWwvdG9waWNzL2ludHJvZHVjdGlvbi9pbWFnZXMvZXllLWljb24ucG5nIi8+CgpUaGUgaGlzdG9yeSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBvdXRwdXRzIHRoYXQgeW91IGhhdmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgeW91ciBhbmFseXNpcy4gVG8gaW5zcGVjdCBhIHBhcnRpY3VsYXIgb3V0cHV0LCB5b3UgY2FuIGNsaWNrIG9uIHRoZSAiZXllIiBpY29uLiBXZSB3aWxsIGRvIHRoaXMgc2hvcnRseSBmb3IgdGhlIGZhc3RxIGZpbGVzIHRoYXQgd2UgaGF2ZSBqdXN0IHVwbG9hZGVkLgoKWW91IG1heSBub3RpY2UgdGhhdCBhcyBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlIGhpc3RvcnksIHRoZSBjb2xvdXIgdGhleSBhcmUgZGlzcGxheWVkIGluIGNoYW5nZXMgb3ZlciB0aW1lLiBUaGVyZSBmb3VyIHBvc3NpYmxlIGNvbG91cnMKCi0gR3JleTsgdGhlIGpvYiBpcyBiZWluZyBoZWxkIGluIGEgcXVldWUKLSBPcmFuZ2U7IHRoZSBqb2IgaXMgY3VycmVudGx5IGJlaW5nIHJ1bgotIEdyZWVuOyB0aGUgam9iIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0gUmVkOyB0aGUgam9iIGZhaWxlZC4gWW91IHdpbGwgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhlIG9wdGlvbnMgYW5kIHRyeSBhZ2FpbgoKVGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucyBhZGQgdGhlIHRvcCBvZiB0aGUgSGlzdG9yeSBwYW5lbCB0byBjcmVhdGUgYSBuZXcgSGlzdG9yeSwgVmlldyBhbGwgY3VycmVudCBIaXN0b3JpZXMgYW5kIGFjY2VzcyBvdGhlciBzZXR0aW5ncyBmb3IgdGhlIGN1cnJlbnQgSGlzdG9yeSBpbmNsdWRpbmcgZGVsZXRpbmcgZmlsZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiBJdCBpcyBhZHZpc2FibGUgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUgZGlzayB1c2FnZSBxdW90YSBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lci4gQXQgdGhlIG1vbWVudCwgdGhpcyB3aWxsIHByb2JhYmx5IGJlIHNob3dpbmcgYFVzaW5nIDAlYAoKCiMgU2VjdGlvbiAyOiBGYXN0cSBmaWxlIGZvcm1hdAoKVGhlIGRhdGEgd2UgYXJlIGxvb2tpbmcgYXQgYXJlIGZyb20gYSAqcGFpcmVkLWVuZCogc2VxdWVuY2luZyBydW4uIFRoaXMgZ3JhcGhpYyBmcm9tIElsbHVtaW5hIGlsbHVzdHJhdGVzIHRoZSBwcm9jZXNzLgoKPGltZyBzcmM9Im1lZGlhL3BhaXJlZF9lbmRfd2hhdF9pcy5wbmciLz4KClBhaXJlZC1lbmQgc2VxdWVuY2luZyBpcyByZWNvbW1lbmRlZCBmb3Igd2hvbGUtZ2Vub21lIGFuZCBleG9tZSBzZXF1ZW5jaW5nLiBJdCBpcyBvZnRlbiB1c2VkIGZvciBSTkEtc2VxIGFuZCBDaGlQLXNlcSwgYWx0aG91Z2ggKnNpbmdsZS1lbmQqIGNvdWxkIGFsc28gYmUgdXNlZCBmb3IgdGhlc2UgYXBwbGljYXRpb25zLgoKWW91IGNhbiB2aWV3IHRoZSBmaWxlcyB5b3UganVzdCB1cGxvYWRlZCBieSBjbGlja2luZyB0aGUgKipleWUgaWNvbioqIHRoZSBoaXN0b3J5IGl0ZW0uIFRoZSBmaXJzdCBmZXcgbGluZXMgc2hvdWxkIHJlYWQgYXMgZm9sbG93cwoKCioqZXhhbXBsZTFfUjEuZmFzdHEqKgoKYGBgCkBEMEVOTUFDWFgxMTEyMDc6MToxMjAxOjM3NzE6MTI3MDgzCkFHQUNBQUFBVFRHVENUR0NUR1RUQ1RBR1RDQUFDQUdUR1RDQ1RHR0FHR1RUVENBQUNDQUdUR0NBQVRUR0dDQUFBQ0FBQUNBQUFDQUFBQ0FBQUNUQUdDVEFHQUFBQUdUQUNDVEdHCisKQ0NDRkZGRkZISEhISEpJSkpKSklKSklKSUpKRUhJSUhHSUdISUpKSUlKP0ZISUlHSkpJSUlJSUdHSUpKSkpKSkpKSUlJSUpKRkhISEJFRUZGREVFRERDREREREREREBDRENDRDwKYGBgCgoqKmV4YW1wbGUxX1IyLmZhc3RxKioKCmBgYApARDBFTk1BQ1hYMTExMjA3OjE6MTIwMTozNzcxOjEyNzA4MwpBQUFHQUNDVFRHVENUQ1RBQUFBQUFUQUFUQUFUQUFUQUdUVEFHR0dBVEFBVEdDQVRUVEFBQVRDVEdUQ1RDQUNUR0FBQVRBR1RBQUdBQVRHQUFBVENBQUFHVEdDVENBQUdBQ0FHQworCkNAQ0ZGRkZGSEhISEhKSkpKSkpKSUlJSUpKSkpKSkpKSkpJSUlKSkpKSklKSkpJSUlKSUpKSkpJSklKSkpKSklJR0pKSklKRkdHSElKSklGRkhHR0hGRkZGRkZFRURFRUVERERECmBgYAoKCgoKVGhlIGZpcnN0IGxpbmUgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIHNlcXVlbmNlZCByZWFkLiBJdCBjYW4gYmUgdXNlZCB0byBlbmNvZGUgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgKnNlcXVlbmNpbmcgbWFjaGluZSosICpmbG93IGNlbGwqIGFuZCAqbGFuZSogdGhhdCB0aGUgcmVhZCB3YXMgZ2VuZXJhdGVkIGZyb20sIGFuZCB0aGUgcGh5c2ljYWwgY29vcmRpbmF0ZXMgb24gdGhlIGxhbmUuICpOb3RpY2UgdGhhdCB0aGUgSUQgZm9yIHRoZSBmaXJzdCByZWFkIGluIHRoZSBgX1IxYCBhbmQgYF9SMmAgZmlsZXMgaXMgdGhlIHNhbWUqLiBTb21ldGltZXMgdGhlc2Ugd2lsbCBoYXZlIGEgYC8xYCBvciBgLzJgIHRvIGluZGljYXRlIHRoZSAiZmlyc3QiIG9yICJzZWNvbmQiIHJlYWQuCgpUaGUgcXVhbGl0eSBzY29yZXMgYXJlIFtBU0NJSV0oaHR0cDovL2FzY2lpLWNvZGUuY29tLykgcmVwcmVzZW50YXRpb25zIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgYSBwYXJ0aWN1bGFyIGJhc2UgaGFzIGJlZW4gY2FsbGVkIGNvcnJlY3RseS4gTGV0dGVycyB0aGF0IGFyZSBmdXJ0aGVyIGFsb25nIHRoZSBhbHBoYWJldCBpbmRpY2F0ZSBoaWdoZXIgY29uZmlkZW5jZS4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiB0cnlpbmcgdG8gaWRlbnRpZnkgdHlwZXMgb2YgZ2Vub21lIHZhcmlhdGlvbiBzdWNoIGFzIHNpbmdsZSBiYXNlIGNoYW5nZXMsIGJ1dCBpcyBhbHNvIGluZGljYXRpdmUgb2YgdGhlIG92ZXJhbGwgcXVhbGl0eSBvZiB0aGUgc2VxdWVuY2luZy4gRGlmZmVyZW50IHNjYWxlcyBoYXZlIGJlZW4gZW1wbG95ZWQgb3ZlciB0aW1lIChyZXN1bHRpbmcgaW4gYSBkaWZmZXJlbnQgc2V0IG9mIGNoYXJhY3RlcnMgYXBwZWFyaW5nIGluIHRoZSBmaWxlKS4gCgoKIyMgRGVyaXZpbmcgdGhlIFF1YWxpdHkgU2NvcmUKCkZpcnN0IG9mIGFsbCwgd2UgY29udmVydCB0aGUgYmFzZS1jYWxsaW5nIHByb2JhYmlsaXR5IChwKSBpbnRvIGEgYFFgIHNjb3JlIHVzaW5nIHRoZSBmb3JtdWxhCgotIFF1YWxpdHkgc2NvcmVzICQkIFEgPSAtMTBsb2dfezEwfXAkJAogICAgKyBRID0gMzAsIHA9MC4wMDEKICAgICsgUSA9IDIwLCBwPTAuMDEKICAgICsgUSA9IDEwLCBwPTAuMQotIFRoZXNlIG51bWVyaWMgcXVhbnRpdGllcyBhcmUgKmVuY29kZWQqIGFzIFsqKkFTQ0lJKipdKGh0dHA6Ly9hc2NpaS1jb2RlLmNvbS8pIGNvZGUKICAgICsgQXQgbGVhc3QgMzMgdG8gZ2V0IHRvIG1lYW5pbmdmdWwgY2hhcmFjdGVycwogICAgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZBU1RRX2Zvcm1hdCkKICAgIAohW10obWVkaWEvcGhyZWQucG5nKSAgICAgIAoKIyMgUXVhbGl0eSBTY29yZXMgdG8gcHJvYmFiaWxpdGllcwoKLSBsb29rLXVwIHRoZSBBU0NJSSBjb2RlIGZvciBlYWNoIGNoYXJhY3RlcgotIHN1YnRyYWN0IHRoZSBvZmZzZXQgdG8gZ2V0IHRoZSBRIHNjb3JlCi0gY29udmVydCB0byBhIHByb2JhYmlsaXR5IHVzaW5nIHRoZSBmb3JtdWxhOi0KCiQkIHAgPSAxMF57LVEvMTB9ICQkCgpMZXQncyBzZWUgdGhpcyBjYWxjdWxhdGlvbiBmb3IgdGhlIGZpcnN0IGZldyBiYXNlcyBvZiB0aGUgZmlyc3QgcmVhZCBpbiBgZXhhbXBsZTFfUjFgOyBgQ0BDRkZGLi4uLmAKCkNoYXJhY3RlciAgfCBDb2RlIHwgTWludXMgMzMgT2Zmc2V0IHwgUHJvYmFiaWxpdHkKLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQpDICB8IDY3IHwgMzQgfCAwLjAwMDQwIApAICB8IDY0IHwgMzEgfCAwLjAwMDc5CkMgIHwgNjcgfCAzNCB8IDAuMDAwNDAKRiAgfCA3MCB8IDM3IHwgMC4wMDAyMApGICB8IDcwIHwgMzcgfCAwLjAwMDIwCkYgIHwgNzAgfCAzNyB8IDAuMDAwMjAKCkluIHByYWN0aWNlLCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgdGhlIHZhbHVlcyBhcyB3ZSBoYXZlIHNvZnR3YXJlIHRoYXQgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkKCi0tLS0tCgojIFNlY3Rpb24gMzogUXVhbGl0eSBhc3Nlc3NtZW50IHdpdGggRmFzdFFDCgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+CipGQVNUQS9GQVNUUSAtPiBGYXN0UUMqIFJlYWQgUXVhbGl0eSBSZXBvcnRzCjwvZGl2PgoKCltGYXN0UUNdKGh0dHBzOi8vd3d3LmJpb2luZm9ybWF0aWNzLmJhYnJhaGFtLmFjLnVrL3Byb2plY3RzL2Zhc3RxYy8pIGlzIGEgcG9wdWxhciB0b29sIGZyb20gW0JhYnJhaGFtIEluc3RpdHV0ZSBCaW9pbmZvcm1hdGljcyBHcm91cF0oaHR0cHM6Ly93d3cuYmlvaW5mb3JtYXRpY3MuYmFicmFoYW0uYWMudWsvaW5kZXguaHRtbCkgdXNlZCBmb3IgKnF1YWxpdHkgYXNzZXNzbWVudCogb2Ygc2VxdWVuY2luZyBkYXRhLiBNb3N0IEJpb2luZm9ybWF0aWNzIHBpcGVsaW5lcyB3aWxsIHVzZSBGYXN0UUMsIG9yIHNpbWlsYXIgdG9vbHMgaW4gdGhlIGZpcnN0IHN0YWdlIG9mIHRoZSBhbmFseXNpcy4gVGhlIFtkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5iaW9pbmZvcm1hdGljcy5iYWJyYWhhbS5hYy51ay9wcm9qZWN0cy9mYXN0cWMvSGVscC8pIGZvciBGYXN0UUMgd2lsbCBoZWxwIHlvdSB0byBpbnRlcnByZXQgdGhlIHBsb3RzIGFuZCBzdGF0cyBwcm9kdWNlZCBieSB0aGUgdG9vbC4gQSB0cmFmZmljIGxpZ2h0IHN5c3RlbSBpcyB1c2VkIHRvIGFsZXJ0IHRoZSB1c2VyJ3MgYXR0ZW50aW9uIHRvIHBvc3NpYmxlIGlzc3Vlcy4gCjxpbWcgc3JjPSJtZWRpYS9tdWx0aXBsZV9zZWxlY3QucG5nIi8+CgoKLSBGcm9tIHRoZSBsZWZ0IGhhbmQgdG9vbCBwYW5lbCBpbiBHYWxheHksICpGQVNUQS9GQVNUUSAtPiBGYXN0UUMqIChPciB1c2luZyB0aGUgU2VhcmNoIHRvb2xzIGJveCkKLSBTZWxlY3QgYWxsIG9mIHRoZSBGQVNUUSBmaWxlcyBhcyBpbnB1dC4gVXNlIHRoZSBtdWx0aXBsZSBkYXRhc2V0cyBidXR0b24gdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgZmlsZS4gSG9sZCB0aGUgQ1RSTCAoV2luZG93cykgb3IgQ29tbWFuZCAoTWFjKSBrZXkgYW5kIHRoZW4gY2xpY2sgb24gbXVsdGlwbGUgZmlsZXMgKFNlZSB0aGUgYWJvdmUgc2NyZWVuc2hvdCkuCi0gKkV4ZWN1dGUqIHRoZSB0b29sLiBZb3UgZG8gbm90IG5lZWQgdG8gY2hhbmdlIGFueSBvZiB0aGUgb3B0aW9ucwotIFdoZW4gdGhlIHRvb2wgZmluaXNoZXMgcnVubmluZywgeW91IHNob3VsZCBoYXZlIGFuIEhUTUwgZmlsZSBpbiB5b3VyIEhpc3RvcnkgZm9yIGVhY2ggRkFTVFEgZmlsZSB0aGF0IHlvdSBzZWxlY3RlZC4gQ2xpY2sgb24gdGhlICJleWUiIGljb24gdG8gdmlldyB0aGUgdmFyaW91cyBxdWFsaXR5IG1ldHJpY3MuCgpUaGUgbW9zdCBpbXBvcnRhbnQgaW1hZ2UgaXMgd2hldGhlciB0aGUgYmFzZSBxdWFsaXR5IGRlY3JlYXNlcyBzaWduaWZpY2FudGx5IG92ZXIgdGhlIGxlbmd0aCBvZiB0aGUgcmVhZAoKIVtdKG1lZGlhL2Zhc3RxYy0yYS5wbmcpCgpHb29kIHF1YWxpdHkgZGF0YSBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZTotCgohW10obWVkaWEvZmFzdHFjLTJiLnBuZykKCgpBY2N1cmF0ZSBiYXNlIGNhbGxzIGFyZSBpbXBvcnRhbnQgYXMgdGhleSBtYWtlIHRoZSBhbGlnbm1lbnQgb2Ygb3VyIHNlcXVlbmNlcyBlYXNpZXIuIFBhcnRpY3VsYXIgZG93bnN0cmVhbSBhbmFseXNlcyBzdWNoIGFzIGlkZW50aWZ5aW5nIG11dGF0aW9ucyB3aWxsIGFsc28gYmUgaGFtcGVyZWQgYnkgcG9vci1xdWFsaXR5IGJhc2UgY2FsbHMuCgpBbGwgaXMgbm90IGxvc3QgaWYgd2Ugb2JzZXJ2ZSBwb29yIHF1YWxpdHkgYmFzZXMgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSByZWFkLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgKnRyaW1taW5nKiBvcHRpb25zIHRoYXQgd2UgY2FuIHVzZSBmb3IgTkdTIGRhdGEsIGFzIHdlIHdpbGwgc2VlIHNob3J0bHkuIAoKSXQgaXMgYWxzbyB3b3J0aCBiZWFyaW5nIGluIG1pbmQgdGhhdCB0aGUgdG9vbCBpcyBibGluZCB0byB0aGUgcGFydGljdWxhciB0eXBlIG9mIHNlcXVlbmNpbmcgeW91IGFyZSBwZXJmb3JtaW5nIChpLmUuIHdob2xlLWdlbm9tZSwgQ2hJUC1zZXEsIFJOQS1zZXEpIGFuZCB0aGUgb3JnYW5pc20gYmVpbmcgc2VxdWVuY2VkLCBzbyBzb21lIHdhcm5pbmdzIG1pZ2h0IGJlIGV4cGVjdGVkIGR1ZSB0byB0aGUgbmF0dXJlIG9mIHlvdXIgZXhwZXJpbWVudC4gRm9yIGluc3RhbmNlLCB0aGVyZSBhcmUga25vd24gc2VxdWVuY2luZyBjb21wb3NpdGlvbiBiaWFzZXMgdGhhdCBjYW4gb2NjdXIgYXQgdGhlIGJlZ2lubmluZyBvZiBSTkEtc2VxIHJlYWRzLiBTby1jYWxsZWQgIndhcm5pbmdzIiBvciAiZXJyb3JzIiBtYXkgYmUgcGVyc2lzdGVudCBmb3IgYWxsIHRoZSBzYW1wbGVzIGluIHlvdXIgZGF0YXNldCwgc28gaXQgaXMgd29ydGggY29tcGFyaW5nIFFDIHJlcG9ydHMgcmF0aGVyIHRoYW4gbG9va2luZyBhdCB0aGUgUUMgb2YgaW5kaXZpZHVhbCBzYW1wbGVzIGluIGlzb2xhdGlvbi4KCiMjIEFnZ3JlZ2F0aW5nIFFDIHJlcG9ydHMgd2l0aCBgbXVsdGlxY2AKCjxkaXYgY2xhc3M9ImluZm9ybWF0aW9uIj4KKlF1YWxpdHkgQ29udHJvbCAtPiBNdWx0aVFDKiBBZ2dyZWdhdGUgcmVzdWx0cyBmcm9tIEJpb2luZm9ybWF0aWNzIGFuYWx5c2lzIGludG8gYSBzaW5nbGUgcmVwb3J0CjwvZGl2PgoKRm9yIGRhdGFzZXRzIHdpdGggbGFyZ2UgbnVtYmVycyBvZiBmYXN0cSBmaWxlcywgaXQgbWF5IGJlIHVzZWZ1bCB0byBhZ2dyZWdhdGUgdGhlIGluZGl2aWR1YWwgcmVwb3J0cyBpbnRvIGEgc2luZ2xlIGNvbWJpbmVkIHJlcG9ydC4gCgotIFVuZGVyIHRoZSB0b29scyBzZWN0aW9uLCBzZWxlY3QgKlF1YWxpdHkgQ29udHJvbCAtPiBNdWx0aVFDKgotIE1ha2Ugc3VyZSAqV2hpY2ggdG9vbCB3YXMgdXNlZCB0byBnZW5lcmF0ZSBsb2dzKiBpcyBzZXQgdG8gYEZhc3RRQ2AKLSBJbiAqUmVzdWx0cyBmaWxlKiwgc2VsZWN0IHRoZSAqKlJhd0RhdGEqKiByZXN1bHRzIGZpbGVzIHRoYXQgeW91IGhhdmUganVzdCBnZW5lcmF0ZWQKCllvdSBzaG91bGQgdGhlbiBiZSBhYmxlIHRvIHZpZXcgdGhlIGZhc3RxYyBwbG90cyBmb3IgYWxsIHRoZSBmYXN0cSBmaWxlcyBvbiB0aGUgc2FtZSBwYWdlLgoKPGRpdiBjbGFzcz0id2FybmluZyI+ClRoZSBtb3N0IGNvbW1vbiBjYXVzZSBvZiBlcnJvcnMgYXJlIG5vdCBzZWxlY3RpbmcgRmFzdFFDIGFzIHRoZSB0b29sIHVzZWQgdG8gZ2VuZXJhdGUgbG9ncywgYW5kIG5vdCBzZWxlY3RpbmcgdGhlIFJhd0RhdGEgb3V0cHV0cy4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJleGVyY2lzZSI+CioqRXhlcmNpc2UqKjogVXNlIHRoZSBgbXVsdGlxY2AgdG9vbCB0byBtYWtlIGEgY29tYmluZWQgUUMgcmVwb3J0IGZvciBhbGwgZmlsZXMgaW4gdGhlIGRhdGFzZXQuIERvZXMgdGhlIHF1YWxpdHkgYXBwZWFyIHRvIGJlIGNvbnNpc3RlbnQgYWNyb3NzIHRoZSBkYXRhc2V0PwoKPC9kaXY+CgojIFNlY3Rpb24gNDogVHJpbW1pbmcKCjxkaXYgY2xhc3M9ImluZm9ybWF0aW9uIj4KRkFTVEEvRkFTVFEgLT4gKipUcmltbW9tYXRpYyoqIGZsZXhpYmxlIHJlYWQgdHJpbW1pbmcgdG9vbCBmb3IgSWxsdWltaW5hIE5HUyBkYXRhCjwvZGl2PgoKCgpJdCBpcyBjb21tb24gdG8gb2JzZXJ2ZSBhIGRlY3JlYXNlIGluIHF1YWxpdHkgc2NvcmVzIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2luZyByZWFkcy4gVGhpcyBpcyBkdWUgdG8gdGhlIHByb2Nlc3Mgb2YgY2xlYXZpbmcgdGVybWluYXRvcnMgYW5kIGNvbG9ycyBsYWJlbHMgbm90IGJlaW5nIDEwMCUsIGFuZCBlcnJvcnMgYWNjdW1tdWxhdGUgYXMgdGhlIHJ1biBwcm9ncmVzc2VzLgoKV2Ugc2hvdWxkIGJlIGNvbmNlcm5lZCBhYm91dCBoYXZpbmcgdG9vIG1hbnkgbG93IHF1YWxpdHkgYmFzZXMgaW4gb3VyIHNlcXVlbmNlcy4gQSBsb3cgcXVhbGl0eSBzY29yZSBtZWFucyB0aGF0IHdlIGFyZSBsZXNzIGNvbmZpZGVudCBhYm91dCB0aGUgYmFzZSB0aGF0IGhhcyBiZWVuIGlkZW50aWZpZWQgYXQgYSBnaXZlbiBwb3NpdGlvbi4gU3VjaCBlcnJvcnMgbWlnaHQgbWFrZSBvdXIgc2VxdWVuY2VzIG1vcmUgZGlmZmljdWx0IHRvIG1hdGNoIHRvIHRoZSByZWZlcmVuY2UgZ2Vub21lIChhbGlnbm1lbnQ7IHNlZSB0aGUgbmV4dCBzZWN0aW9uKSwgb3IgYmUgbWlzdGFrZW4gZm9yIGdlbnVpbmUgZGlmZmVyZW5jZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGdlbm9tZS4KCipPbmUqIHBvcHVsYXIgdG9vbCBpcyBjYWxsZWQgYFRyaW1tb21hdGljYAoKLSBbVHJpbW1vbWF0aWM6IEEgZmxleGlibGUgcmVhZCB0cmltbWluZyB0b29sIGZvciBJbGx1bWluYSBOR1MgZGF0YV0oaHR0cDovL3d3dy51c2FkZWxsYWIub3JnL2Ntcy8/cGFnZT10cmltbW9tYXRpYykKCkl0IGhhcyBtYW55IHRyaW1taW5nIG9wdGlvbnMsIGluY2x1ZGluZyBhICpzbGlkaW5nIHdpbmRvdyogYXBwcm9hY2ggd2hlcmUgdGhlIHF1YWxpdHkgc2NvcmVzIG9mIE4gY29uc2VjdXRpdmUgYmFzZXMgKDQgaXMgdGhlIGRlZmF1bHQpIGFyZSBhdmVyYWdlZC4gSWYgdGhhdCBhdmVyYWdlIGZhbGxzIGJlbG93IGEgcHJlLWRlZmluZWQgY3V0LW9mZiwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVhZCBpcyBkaXNjYXJkZWQuIFdlIGNhbiBhcHBseSB0aGlzIGFwcHJvYWNoIHRvIG91ciBkYXRhIGFzIGZvbGxvd3M6LQoKCi0gRmluZCB0aGUgYFRyaW1tb21hdGljYCB0b29sIGluIEdhbGF4eQotIENoYW5nZSAqKlNpbmdsZS1lbmQgb3IgcGFpcmVkLWVuZCByZWFkcz8qKiB0byBgUGFpcmVkLWVuZCAodHdvIHNlcGFyYXRlIGlucHV0IGZpbGVgKQotIFVzZSB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIGJ1dHRvbiB0byBzZWxlY3QgYGV4YW1wbGUxX1IxYCwgYGV4YW1wbGUyX1IxYCBhcyB0aGUgYFIxL2ZpcnN0IG9mIHBhaXJgIGZpbGVzIGFuZCBgZXhhbXBsZTFfUjJgLCBgZXhhbXBsZTJfUjJgIGFzIHRoZSBgUjIvc2Vjb25kIG9mIHBhaXJgIGZpbGVzLgotIEtlZXAgKipTZWxlY3QgVHJpbW1vbWF0aWMgb3BlcmF0aW9uIHRvIHBlcmZvcm0qKiBvbiBgU2xpZGluZyB3aW5kb3cgdHJpbW1pbmcgKFNMSURJTkdXSU5ET1cpYAotIEtlZXAgKipOdW1iZXIgb2YgYmFzZXMgdG8gYXZlcmFnZSBhY3Jvc3MqKiBhcyBgNGAKLSBLZWVwICoqQXZlcmFnZSBxdWFsaXR5IHJlcXVpcmVkKiogYXMgYDIwYAotIENsaWNrIG9uICoqKyBJbnNlcnQgVHJpbW1vbWF0aWMgT3BlcmF0aW9uKioKLSBTZWxlY3QgYERyb3AgcmVhZHMgYmVsb3cgYSBzcGVjaWZpZWQgbGVuZ3RoIChNSU5MRU4pYCBmcm9tICoqU2VsZWN0IFRyaW1tb21hdGljIG9wZXJhdGlvbiB0byBwZXJmb3JtKioKLSBLZWVwIHRoZSAqKk1pbmltdW0gbGVuZ3RoIG9mIHJlYWRzIHRvIGJlIGtlcHQgYXMgYDIwYAotIEV4ZWN1dGUKCkEgdG90YWwgb2YgOCBvdXRwdXRzIGFyZSBjcmVhdGVkIGFuZCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBvdXRwdXRzIHdpdGggKnBhaXJlZCogaW4gdGhlIG5hbWUuIFRoZSAqdW5wYWlyZWQqIGZpbGVzIGNvbnRhaW4gcmVhZHMgdGhhdCBhcmUgZGlzY2FyZGVkIGZyb20gdGhlIGBSMWAgZmlsZSBidXQgbm90IGBSMmAgKGFuZCB2aWNlLXZlcnNhKSwgc28gYXJlIG5vdCB1c2VmdWwgZm9yIGRvd25zdGVhZCBhbmFseXNpcyB3aGVyZSB3ZSBhc3N1bWUgd2UgaGF2ZSBzZXF1ZW5jZWQgaW4gYm90aCBkaXJlY3Rpb25zLgoKPGRpdiBjbGFzcz0iZXhlcmNpc2UiPgoqKkV4ZXJjaXNlKio6IFJlbmFtZSB0aGUgKnBhaXJlZCogdHJpbW1vbWF0aWMgb3V0cHV0IGZvciB0aGUgaW5wdXQgZmlsZXMgdG8KCi0gZXhhbXBsZTFfUjFfdHJpbW1lZC5mYXN0cQotIGV4YW1wbGUxX1IyX3RyaW1tZWQuZmFzdHEKLSBleGFtcGxlMl9SMV90cmltbWVkLmZhc3RxCi0gZXhhbXBsZTJfUjFfdHJpbW1lZC5mYXN0cQoKKiooT3B0aW9uYWwpKiogSWYgeW91IGhhdmUgdGltZSwgcmUtcnVuIGBGYXN0UUNgIG9uIHRoZXNlIHRyaW1tZWQgZmlsZXMuIFdoYXQgZGlmZmVyZW5jZXMgZG8geW91IHNlZT8KPC9kaXY+CgotLS0tLQoKPGRpdiBjbGFzcz0iaW5mb3JtYXRpb24iPgpJZiB5b3VyIFFDIHJlcG9ydHMgc3VnZ2VzdCBjb250YW1pbmF0aW9uIGJ5IHRoZSAqYWRhcHRlciogc2VxdWVuY2VzIHVzZWQgZHVyaW5nIHNlcXVlbmNpbmcsIFRyaW1tb21hdGljIGhhcyB0aGUgb3B0aW9uIHRvIHJlbW92ZSB0aGVzZSBieSBjbGlja2luZyB0aGUgKipQZXJmb3JtIGluaXRpYWwgSUxMVU1JTkFDTElQIHN0ZXAqKiBidXR0b24uIFRoaXMgaXMgYW4gb3B0aW9uIHRvIHNlbGVjdCB3aGljaCBJbGx1bWluYSBzZXF1ZW5jaW5nIHlvdSBoYXZlIHBlcmZvcm1lZCBpbiBvcmRlciB0aGF0IHRoZSBjb3JyZWN0IGFkYXB0ZXIgc2VxdWVuY2VzIGNhbiBiZSBpZGVudGlmaWVkLgo8L2Rpdj4KCgojIFNlY3Rpb24gNTogQWxpZ25tZW50Cgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+CipNYXBwaW5nKiAtPiAqTWFwIHdpdGggQldBKgo8L2Rpdj4KCldlIGRvbid0IHJlYWxseSBzcGVuZCBtdWNoIHRpbWUgbG9vayBhdCAqZmFzdHEqIGZpbGVzLCBhcyBtb3N0IG9mIG91ciB0aW1lIGlzIHNwZW50IHdpdGggKmFsaWduZWQqIHJlYWRzLiBpLmUuIHdlIGhhdmUgdXNlZCBzb21lIHNvZnR3YXJlIHRvIHRlbGwgdXMgd2hlcmVhYm91dHMgaW4gdGhlIGdlbm9tZSBlYWNoIHJlYWQgYmVsb25ncyB0by4gVGhpcyB3aWxsICp1c3VhbGx5KiBiZSBwZXJmb3JtZWQgZm9yIHlvdSBhcyBwYXJ0IG9mIGEgc2VxdWVuY2luZyBzZXJ2aWNlLCBidXQgaXQgaXMgZ29vZCB0byBnZXQgYW4gYXBwcmVjaWF0aW9uIG9mIHRoZSBzdGVwcyBpbnZvbHZlZC4KCkluIHRoaXMgc2VjdGlvbiB3ZSBtYXAgdGhlIHJlYWRzIGluIG91ciBGQVNUUSBmaWxlcyB0byBhIHJlZmVyZW5jZSBnZW5vbWUuIFRoaXMgZmlndXJlIGZyb20gdGhlIEdhbGF4eSBUcmFpbmluZyBOZXR3b3JrIGlsbHVzdHJhdGVzIHRoZSBwcm9jZWR1cmUgZm9yIHRocmVlIHJlYWRzIHRoYXQgbWFwIGF0IHBvc2l0aW9ucyAxMDAsIDExNCBhbmQgMTIzIG9mIGEgcmVmZXJlbmNlIGdlbm9tZQoKPGltZyBzcmM9Imh0dHBzOi8vdHJhaW5pbmcuZ2FsYXh5cHJvamVjdC5vcmcvdHJhaW5pbmctbWF0ZXJpYWwvdG9waWNzL3NlcXVlbmNlLWFuYWx5c2lzL2ltYWdlcy9tYXBwaW5nL21hcHBpbmcucG5nIi8+CgpBIHBsZXRob3JhIG9mIGRpZmZlcmVudCB0b29scyBoYXZlIGJlZW4gd3JpdHRlbiB0byBwZXJmb3JtIHRoaXMgdGFzaywgYW5kIHdlIHdpbGwgbm90IGRlc2NyaWJlIGl0IGluIGRldGFpbC4gQWxpZ25tZW50IHJlbGllcyBvbiB0aGUgcmVmZXJlbmNlIGdlbm9tZSBiZWluZyAqaW5kZXhlZCogc28gdGhhdCB0aGUgc2VxdWVuY2luZyByZWFkcyBjYW4gYmUgbG9jYXRlZCBtb3JlIGVmZmljaWVudGx5LiBUaGUgZ2Vub21lIGluZGV4IGlzIGEgaGlnaGx5LWFjY2Vzc2libGUgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBHYWxheHkgaW5jbHVkZXMgaW5kaWNlcyBmb3IgbWFueSBwb3B1bGFyIGdlbm9tZXMuIAoKPGRpdiBjbGFzcz0iaW5mb3JtYXRpb24iPgoKSWYgeW91ciBnZW5vbWUgb2YgaW50ZXJlc3QgaXMgbm90IGF2YWlsYWJsZSBpbiBHYWxheHksIHlvdSBjYW4gdXBsb2FkIGEgYC5mYXN0YWAgZmlsZSBjb250YWluaW5nIHRoZSByZWZlcmVuY2Ugc2VxdWVuY2VzLiBGcm9tIHRoZSAqKldpbGwgeW91IHNlbGVjdCBhIHJlZmVyZW5jZSBnZW5vbWUgZnJvbSB5b3VyIGhpc3Rvcnkgb3IgdXNlIGEgYnVpbHQtaW4gaW5kZXgqKiBkcm9wLWRvd24geW91IGNhbiBzZWxlY3QgYFVzZSBhIGdlbm9tZSBmcm9tIGhpc3RvcnkgYW5kIGJ1aWxkIGluZGV4YAo8L2Rpdj4KCiMjIyMgMS5BbGlnbiB0aGUgZXhhbXBsZSBmaWxlcyAgCgohW10obWVkaWEvYndhLXRvb2wucG5nKQoKLSBGaW5kIHRoZSB0b29sICpNYXBwaW5nKiAtPiAqTWFwIHdpdGggQldBKgogICsgYWx0ZXJuYXRpdmVseSwgdHlwZSBgYndhYCBpbiB0aGUgc2VhcmNoIGJveAotIEluICpTZWxlY3QgaW5wdXQgdHlwZT8qIFNlbGVjdCAqKlBhaXJlZC1mYXN0cSoqCi0gVXNlIGBleGFtcGxlMV9SMV90cmltbWVkLmZhc3RxYCwgYGV4YW1wbGUyX1IxX3RyaW1tZWQuZmFzdHFgIGFuZCBgZXhhbXBsZTFfUjJfdHJpbW1lZC5mYXN0cWAsIGBleGFtcGxlMl9SMl90cmltbWVkLmZhc3RxYCBhcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBzZXQgb2YgcmVhZHMgcmVzcGVjdGl2ZWx5LgotIE1ha2Ugc3VyZSB0aGUgcmVmZXJlbmNlIGdlbm9tZSBpcyBzZXQgdG8gKipIdW1hbiBEZWMuIDIwMTMgKEdSQ2gzOC9oZzM4KSAoaGczOCkqKgotIFByZXNzICpFeGVjdXRlKgotIFdhaXQhCgpUaGUgcmVzdWx0IHdpbGwgYmUgYSBgLmJhbWAgZmlsZSB0aGF0IHdlIHdpbGwgZGVzY3JpYmUgaW4gdGhlIG5leHQgc2VjdGlvbi4gVGhpcyBmaWxlIGlzIG5vdCB1c3VhbGx5IGh1bWFuLXJlYWRhYmxlLCBhcyBpdCBpcyBjb21wcmVzc2VkLiBIb3dldmVyLCBHYWxheHkgaXMgYWJsZSB0byBkaXNwbGF5IHRoZSBjb250ZW50cy4KCiMjIyMgMi4gVmlldyB0aGUgYWxpZ25tZW50cwoKMS4gIENsaWNrIG9uIHRoZSBleWUgb2YgdGhlIHJlc3VsdGluZyBmaWxlIHRvIHZpZXcgdGhlIGFsaWdubWVudHMuCgoKIVtdKG1lZGlhL2JhbS1hbGlnbm1lbnRzLnBuZykKCiMjIyBBYm91dCB0aGUgYGJhbWAgZmlsZSBmb3JtYXQKClVubGlrZSBtb3N0IG9mIEJpb2luZm9ybWF0aWNzLCBhICpzaW5nbGUgc3RhbmRhcmQqIGZpbGUgZm9ybWF0IGhhcyBlbWVyZ2VkIGZvciBhbGlnbmVkIHJlYWRzLiBNb3Jlb3ZlciwgdGhpcyBmaWxlIGZvcm1hdCBpcyBjb25zaXN0ZW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB5b3UgaGF2ZSBETkEtc2VxLCBSTkEtc2VxLCBDaElQLXNlcS4uLiBkYXRhLiAKClRoZSBgYmFtYCBmaWxlIGlzIGEgY29tcHJlc3NlZCwgYmluYXJ5LCB2ZXJzaW9uIG9mIGEgYHNhbWAgZmlsZS4gTW9zdCBhbGlnbmVycyB3aWxsIHByb2R1Y2UgYSBgc2FtYCBmaWxlIGFzIHRoZWlyIGluaXRpYWwgb3V0cHV0LgoKIyMjIFRoZSBgLnNhbWAgLyBgLmJhbWAgZmlsZQoKVGhlIGZpcnN0IHBhcnQgb2YgdGhlIGhlYWRlciBsaXN0cyB0aGUgbmFtZXMgKGBTTmApIG9mIHRoZSBzZXF1ZW5jZXMgKGNocm9tb3NvbWVzKSB1c2VkIGluIGFsaWdubWVudCwgdGhlaXIgbGVuZ3RoIChgTE5gKSBhbmQgc29tZXRpbWVzIGEgKm1kNXN1bSogIltkaWdpdGFsIGZpbmdlcnByaW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZDVzdW0pIiBvZiB0aGUgYC5mYXN0YWAgZmlsZSB1c2VkIGZvciBhbGlnbm1lbnQgKGBNNWApLgoKYGBgCgpASEQgVk46MS4zIFNPOmNvb3JkaW5hdGUKQFNRIFNOOmNocjEgTE46MjQ4OTU2NDIyCkBTUSBTTjpjaHIxMCBMTjoxMzM3OTc0MjIKQFNRIFNOOmNocjExIExOOjEzNTA4NjYyMgpAU1EgU046Y2hyMTFfS0kyNzA3MjF2MV9yYW5kb20gTE46MTAwMzE2CkBTUSBTTjpjaHIxMiBMTjoxMzMyNzUzMDkKQFNRIFNOOmNocjEzIExOOjExNDM2NDMyOAouLi4uLgouLi4uLgoKYGBgCgoKV2UgYWxzbyBoYXZlIGEgc2VjdGlvbiB3aGVyZSB3ZSBjYW4gcmVjb3JkIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIHVzZWQgdG8gZGVyaXZlIHRoZSBmaWxlCmBgYApAUEcgSUQ6YndhIFBOOmJ3YSBWTjowLjcuMTctcjExODggQ0w6YndhIHNhbXBlIC9kYXRhL2RiL2RhdGFfbWFuYWdlcnMvaGczOC9id2FfbWVtX2luZGV4L2hnMzgvaGczOC5mYSBmaXJzdC5zYWkgc2Vjb25kLnNhaSAvZGF0YS9kbmIwMy9nYWxheHlfZGIvZmlsZXMvZi85LzMvZGF0YXNldF9mOTM4NzY5Mi0yYjNmLTQ5YzktODIyOC1kNzMwOTMwMGVkMjguZGF0IC9kYXRhL2RuYjAzL2dhbGF4eV9kYi9maWxlcy9kLzAvYy9kYXRhc2V0X2QwYzc5NjE2LTM1YTktNGI0ZC1hMGU0LTM1YTdhZDc0NzM3Yi5kYXQiCi4uLi4KLi4uLgoKYGBgCgpOZXh0IGlzIGEgKnRhYi1kZWxpbWl0ZWQqIHNlY3Rpb24gdGhhdCBkZXNjcmliZXMgdGhlIGFsaWdubWVudCBvZiBlYWNoIHNlcXVlbmNlIGluIGRldGFpbC4gCgpgYGAKRDBFTk1BQ1hYMTExMjA3OjI6MjEwMzo5ODI1OjE1ODU2Nwk5OQljaHIxCTE2OTE3Njc0Nwk2MAkxMDFNCT0JMTY5MTc2OTYyCTMxNglBQVRUR0dHQ0FUVENUVENBR0FBR0dBVEdBR0NUQ0FBQ1RBQUFBQUFHQUFHQUdUQ0FHQUFBQUFUQ1RDVFRBQUNUQ0FDVFRUVEFUQVRBQUFUVEFDVFRBR1RBVFRUVEFHQ0FBQUFBQwlDQ0NGRkZGRkhBSEhISkpJSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSUlCRkhJSUlKSklJSUpKSkpKSkpKSklKSkhISEhIRkZGRkZGRkRFRUVFRUFERUVFRUVERERERERERAlYVDpBOlUgTk06aTowIFNNOmk6MzcgQU06aTozNyBYMDppOjEgWDE6aTowIFhNOmk6MCBYTzppOjAgWEc6aTowIE1EOlo6MTAxYApgYGAKCkNvbHVtbiB8IE9mZmljaWFsIE5hbWUgfCBCcmllZgotLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tCjEgICAgICB8IFFOQU1FICAgICAgICAgIHwgU2VxdWVuY2UgSUQKMiAgICAgIHwgRkxBRyAgICAgICAgICAgfCBTZXF1ZW5jZSBxdWFsaXR5IGV4cHJlc3NlZCBhcyBhIGJpdHdpc2UgZmxhZwozICAgICAgfCBSTkFNRSAgICAgICAgICB8IENocm9tb3NvbWUKNCAgICAgIHwgUE9TICAgICAgICAgICAgfCBTdGFydCBQb3NpdGlvbgo1ICAgICAgfCBNQVBRICAgICAgICAgICB8IE1hcHBpbmcgUXVhbGl0eQo2ICAgICAgfCBDSUdBUiAgICAgICAgICB8IERlc2NyaWJlcyBwb3NpdGlvbnMgb2YgbWF0Y2hlcywgaW5zZXJ0aW9ucywgZGVsZXRpb25zIHcuci50IHJlZmVyZW5jZQo3ICAgICAgfCBSTkVYVCAgICAgICAgICB8IFJlZi4gbmFtZSBvZiBtYXRlIC8gbmV4dCByZWFkCjggICAgICB8IFBORVhUICAgICAgICAgIHwgUG9zaXRpb24gb2YgbWF0ZSAvIG5leHQgcmVhZAo5ICAgICAgfCBUTEVOICAgICAgICAgICB8IE9ic2VydmVkIFRlbXBsYXRlIGxlbmd0aAoxMCAgICAgfCBTRVEgICAgICAgICAgICB8IFNlcXVlbmNlCjExICAgICB8IFFVQUwgICAgICAgICAgIHwgQmFzZSBRdWFsaXRpZXMKClRoZXJlIGNhbiBhbHNvIGJlIGFsbCBtYW5uZXIgb2Ygb3B0aW9uYWwgdGFncyBhcyBleHRyYSBjb2x1bW5zIGludHJvZHVjZSBieSBhbiBhbGlnbmVyIG9yIGRvd25zdHJlYW0gYW5hbHlzaXMgdG9vbC4gQSBjb21tb24gdXNlIGlzIHRoZSBgUkdgIHRhZyB3aGljaCByZWZlcnMgYmFjayB0byB0aGUgcmVhZCBncm91cHMgaW4gdGhlIGhlYWRlci4KCgojIyMgU29ydGluZyBhbmQgaW5kZXhpbmcKCllvdSB3aWxsIG5vdGljZSBmcm9tIHRoZSAzcmQgY29sdW1uIHRoYXQgdGhlIHJlYWRzIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGVpciBzdGFydCBwb3NpdGlvbjsgd2hlcmVhcyB0aGUgcmVhZHMgaW4gdGhlIGBmYXN0cWAgZmlsZSB3ZXJlIGFycmFuZ2VkIGluIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGdlbmVyYXRlZCBvbiB0aGUgZmxvdyBjZWxsLiBCeSBkZWZhdWx0LCBgYndhLW1lbWAgcHJvZHVjZXMgYSBiYW0gd2hlcmUgdGhlIHJlYWRzIGFyZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYGZhc3RxYC4gSG93ZXZlciwgdGhpcyBpcyByYXRoZXIgaW5jb252ZW5pZW50IGZvciBhbmFseXNpcyB3aGVyZSB3ZSByZXF1aXJlIHJlYWRzIGZyb20gdGhlIHNhbWUgbG9jYXRpb24gdG8gYmUgbmV4dCB0byBlYWNoIG90aGVyIGluIHRoZSBmaWxlLgoKQW4gYWRkaXRpb25hbCBjb3VwbGUgb2Ygc3RlcHMgaGF2ZSBiZWVuIHBlcmZvcm1lZCBhZnRlciBid2EtbWVtOyBzb3J0aW5nIHRoZSBmaWxlIGFjY29yZGluZyB0byBnZW5vbWUgcG9zaXRpb24gYW5kIHByb2R1Y2luZyBhbiAqaW5kZXgqIGZpbGUuIFRoZSBpbmRleCBmaWxlIGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBmb3IgdXMgYW5kIGNhbm5vdCBiZSB2aWV3ZWQgaW4gR2FsYXh5LiBIb3dldmVyLCB3ZSB3aWxsIG5lZWQgaXQgbGF0ZXIgb24gd2hlbiB2aWV3aW5nIHRoZSBkYXRhIGluIElHVi4gCgo8ZGl2IGNsYXNzPSJpbmZvcm1hdGlvbiI+ClNob3VsZCB5b3UgZXZlciBuZWVkIHRvLCB5b3UgY2FuIHNvcnQgYSBgYmFtYCBmaWxlIGJ5IGNvb3JkaW5hdGUgb3IgbmFtZSB1c2luZyB0aGUgKipTYW10b29scyBzb3J0KiogdG9vbCBpbiBHYWxheHkuIFRoZSAqKlNhbXRvb2xzIHZpZXcqKiB0b29sIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIGAuc2FtYCBhbmQgYC5iYW1gIGZpbGUgdHlwZXMKPC9kaXY+CgojIyMgUXVhbGl0eSBGbGFncwoKVGhlICoiZmxhZ3MiKiBpbiB0aGUgc2FtIGZpbGUgY2FuIHJlcHJlc2VudCB1c2VmdWwgUUMgaW5mb3JtYXRpb24KCiAgKyBSZWFkIGlzIHVubWFwcGVkCiAgKyBSZWFkIGlzIHBhaXJlZCAvIHVucGFpcmVkCiAgKyBSZWFkIGZhaWxlZCBRQwogICsgUmVhZCBpcyBhIFBDUiBkdXBsaWNhdGUgKHNlZSBsYXRlcikKClRoZSBjb21iaW5hdGlvbiBvZiBhbnkgb2YgdGhlc2UgcHJvcGVydGllcyBpcyB1c2VkIHRvIGRlcml2ZSBhIG51bWVyaWMgdmFsdWUKCiMjIyBEZXJpdmF0aW9uCgpUaGVyZSBpcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgYSByZWFkIGNhbiBwb3NzZXNzLiBJZiBhIHBhcnRpY3VsYXIgcHJvcGVydHkgaXMgb2JzZXJ2ZWQsIGEgY29ycmVzcG9uZGluZyBwb3dlciBvZiAyIGlzIGFkZGVkIG11bHRpcGxpZWQgYnkgMS4gVGhlIGZpbmFsIHZhbHVlIGlzIGRlcml2ZWQgYnkgc3VtbWluZyBhbGwgdGhlIHBvd2VycyBvZiAyLgoKIVtdKGh0dHBzOi8vZ2FsYXh5cHJvamVjdC5vcmcvdHV0b3JpYWxzL25ncy9zYW1fZmxhZy5wbmcpCgpGbGFnIFZhbHVlIHwgTWVhbmluZwotLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KNjkgKD0gMSArIDQgKyA2NCkgCXwgVGhlIHJlYWQgaXMgcGFpcmVkLCBpcyB0aGUgZmlyc3QgcmVhZCBpbiB0aGUgcGFpciwgYW5kIGlzIHVubWFwcGVkLgo3NyAoPSAxICsgNCArIDggKyA2NCkgfAlUaGUgcmVhZCBpcyBwYWlyZWQsIGlzIHRoZSBmaXJzdCByZWFkIGluIHRoZSBwYWlyLCBib3RoIGFyZSB1bm1hcHBlZC4KODMgKD0gMSArIDIgKyAxNiArIDY0KSB8CVRoZSByZWFkIGlzIHBhaXJlZCwgbWFwcGVkIGluIGEgcHJvcGVyIHBhaXIsIGlzIHRoZSBmaXJzdCByZWFkIGluIHRoZSBwYWlyLCBhbmQgaXQgaXMgbWFwcGVkIHRvIHRoZSByZXZlcnNlIHN0cmFuZC4KOTkgKD0gMSArIDIgKyAzMiArIDY0KSB8CVRoZSByZWFkIGlzIHBhaXJlZCwgbWFwcGVkIGluIGEgcHJvcGVyIHBhaXIsIGlzIHRoZSBmaXJzdCByZWFkIGluIHRoZSBwYWlyLCBhbmQgaXRzIG1hdGUgaXMgbWFwcGVkIHRvIHRoZSByZXZlcnNlIHN0cmFuZC4KMTMzICg9IDEgKyA0ICsgMTI4KSB8CVRoZSByZWFkIGlzIHBhaXJlZCwgaXMgdGhlIHNlY29uZCByZWFkIGluIHRoZSBwYWlyLCBhbmQgaXQgaXMgdW5tYXBwZWQuCjEzNyAoPSAxICsgOCArIDEyOCkgIHwJVGhlIHJlYWQgaXMgcGFpcmVkLCBpcyB0aGUgc2Vjb25kIHJlYWQgaW4gdGhlIHBhaXIsIGFuZCBpdCBpcyBtYXBwZWQgd2hpbGUgaXRzIG1hdGUgaXMgbm90LgoxNDEgKD0gMSArIDQgKyA4ICsgMTI4KSB8CVRoZSByZWFkIGlzIHBhaXJlZCwgaXMgdGhlIHNlY29uZCByZWFkIGluIHRoZSBwYWlyLCBidXQgYm90aCBhcmUgdW5tYXBwZWQuCjE0NyAoPSAxICsgMiArIDE2ICsgMTI4KSB8CVRoZSByZWFkIGlzIHBhaXJlZCwgbWFwcGVkIGluIGEgcHJvcGVyIHBhaXIsIGlzIHRoZSBzZWNvbmQgcmVhZCBpbiB0aGUgcGFpciwgYW5kIG1hcHBlZCB0byB0aGUgcmV2ZXJzZSBzdHJhbmQuCjE2MyAoPSAxICsgMiArIDMyICsgMTI4KSB8CVRoZSByZWFkIGlzIHBhaXJlZCwgbWFwcGVkIGluIGEgcHJvcGVyIHBhaXIsIGlzIHRoZSBzZWNvbmQgcmVhZCBpbiB0aGUgcGFpciwgYW5kIGl0cyBtYXRlIGlzIG1hcHBlZCB0byB0aGUgcmV2ZXJzZSBzdHJhbmQuCgoKClNlZSBhbHNvCgotIGh0dHBzOi8vYnJvYWRpbnN0aXR1dGUuZ2l0aHViLmlvL3BpY2FyZC9leHBsYWluLWZsYWdzLmh0bWwKCiMjIyBIYXZlIGEgQ0lHQVIhCgpUaGUgKioqQ0lHQVIqKiogKCoqQyoqb21wYWN0ICoqSSoqZGlvc3luY3JhdGljICoqRyoqYXBwZWQgKipBbGlnbm1lbnQqKiAqKlIqKmVwb3J0KSBzdHJpbmcgaXMgYSB3YXkgb2YgZW5jb2RpbmcgdGhlIG1hdGNoIGJldHdlZW4gYSBnaXZlbiBzZXF1ZW5jZSBhbmQgdGhlIHBvc2l0aW9uIGl0IGhhcyBiZWVuIGFzc2lnbmVkIGluIHRoZSBnZW5vbWUuIEl0IGlzIGNvbXByaXNlZCBieSBhIHNlcmllcyBvZiBsZXR0ZXJzIGFuZCBudW1iZXJzIHRvIGluZGljYXRlIGhvdyBtYW55IGNvbnNlY3V0aXZlIGJhc2VzIGhhdmUgdGhhdCBtYXBwaW5nLgoKCiAKIENvZGUgIHwgRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0KTSAgfCBhbGlnbm1lbnQgbWF0Y2gKSSAgfCBpbnNlcnRpb24KRCAgfCBkZWxldGlvbgpOICB8IHNraXBwZWQKUyAgfCBzb2Z0LWNsaXBwaW5nCkggIHwgaGFyZC1jbGlwcGluZwoKCmUuZy4KCi0gYDY4TWAKICAgICsgNjggYmFzZXMgbWF0Y2hpbmcgdGhlIHJlZmVyZW5jZQotIGAxUzY3TWAKICAgICsgMSBzb2Z0LWNsaXBwZWQgcmVhZCBmb2xsb3dlZCBieSA2NyBtYXRjaGVzCi0gYDE1TTg3TjcwTTkwTjE2TWAKICAgICsgMTUgbWF0Y2hlcyBmb2xsb3dpbmcgYnkgODcgYmFzZXMgc2tpcHBlZCBmb2xsb3dlZCBieSA3MCBtYXRjaGVzIGV0Yy4KCgojIyMjIDMuIENoZWNrIHRoZSBhbGlnbm1lbnQgc3RhdHMKCjxkaXYgY2xhc3M9ImluZm9ybWF0aW9uIj4KKlNBTS9CQU06LSA+IFNhbXRvb2xzIGZsYWdzdGF0KgoqU0FNL0JBTSAtPiBTYW10b29scyBpZHhzdGF0cyoKPC9kaXY+CgpXZSB3aWxsIG5vdyBnZW5lcmF0ZSBhIGZldyBiYXNpYyBzdGF0aXN0aWNzIGFib3V0IHRoZSBhbGlnbm1lbnQgb2Ygb3VyIGRhdGE7IHN1Y2ggYXMgdGhlIHRvdGFsIG51bWJlciBvZiByZWFkcyBhbmQgaG93IG1hbnkgd2VyZSBhbGlnbmVkLiBJbiB0aGUgY2FzZSBvZiBwYWlyZWQtZW5kIGRhdGEsIGl0IHdpbGwgYWxzbyB0ZWxsIHlvdSBob3cgbWFueSBwYWlycyB3ZXJlIHdpdGhpbiB0aGUgZXhwZWN0ZWQgZGlzdGFuY2Ugb2YgZWFjaCBvdGhlciBhbmQgbG9jYXRlZCBvbiB0aGUgc2FtZSBjaHJvbW9zb21lLgoKMS4gU2VsZWN0IHRoZSB0b29sICpTQU0vQkFNOi0gPiBTYW10b29scyBmbGFnc3RhdCogCjIuIEluIHRoZSAqQkFNIEZpbGUgdG8gcmVwb3J0IHN0YXRpc3RpY3Mgb2YqIGJveCBjaG9vc2UgdGhlIGJhbSBmaWxlKHMpIHByb2R1Y2VkIGJ5IGBid2FgLgoKClRoZSB0b29sIHdpbGwgYWxzbyByZXBvcnQgaG93IG1hbnkgKioqUENSIER1cGxpY2F0ZXMqKiogaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBkYXRhLiBCdXQgYXMgd2UgaGF2ZW4ndCB5ZXQgcnVuIGFueSBzb2Z0d2FyZSB0byBpZGVudGlmeSBzdWNoIHJlYWRzLCB0aGUgZmxhZ3N0YXQgb3V0cHV0IHdpbGwgc2hvdyAwIHJlYWRzLgoKPGRpdiBjbGFzcz0iaW5mb3JtYXRpb24iPgoqU0FNL0JBTSAtPiBTYW10b29scyBpZHhzdGF0cyoKPC9kaXY+CgoxLiBGaW5kIHRoZSB0b29sICpTQU0vQkFNIC0+IFNhbXRvb2xzIGlkeHN0YXRzKgoyLiBJbiB0aGUgKkJBTSBmaWxlKiBkcm9wZG93biBzZWxlY3QgdGhlIGJhbSBmaWxlIHByb2R1Y2VkIGJ5IGBid2FgCgpUaGUgb3V0cHV0IG9mIHRoaXMgdG9vbCB3aWxsIHRlbGwgeW91IGhvdyBtYW55IHJlYWRzIGFsaWduZWQgdG8gZWFjaCBjaHJvbW9zb21lIGluIHlvdXIgcmVmZXJlbmNlIGdlbm9tZS4KCgojIyMgQWJvdXQgRHVwbGljYXRlcwoKVGhlIHByZXBhcmF0aW9uIG9mIGEgc2VxdWVuY2luZyBsaWJyYXJ5IHJlcXVpcmVzICpQQ1IqIGFtcGxpZmljYXRpb24gb2YgeW91ciBzdGFydGluZyBtYXRlcmlhbC4gVGhpcyBjYW4gbGVhZCB0byBzb21lIEROQSBmcmFnbWVudHMgYmVpbmcgb3Zlci1yZXByZXNlbnRlZCBpbiB5b3VyIGRhdGEuIEFzIG91ciBETkEgZnJhZ21lbnRzIGFyZSBmb3JtZWQgaW4gYSByYW5kb20gcHJvY2VzcywgYW5kIHJlbGF0aXZlbHkgc21hbGwgY29tcGFyZWQgdG8gdGhlIG51bWJlciBvZiBiYXNlcyB0byBiZSBzZXF1ZW5jZWQgZnJvbSB0aGUgZ2Vub21lICgzR2IgaW4gaHVtYW5zKSwgd2UgdGVuZCB0byB0aGluayB0aGUgdHdvIEROQSBmcmFnbWVudHMgdGhhdCBoYXZlIGlkZW50aWNhbCBzdGFydGluZyBhbmQgZW5kaW5nIHBvc2l0aW9uIGFyZSB1bmxpa2VseSB0byBoYXZlIG9jY3VycmVkIGR1ZSB0byBjaGFuY2UuIFNvbWUgc29mdHdhcmUsIHN1Y2ggYXMgW1BpY2FyZF0oaHR0cDovL2Jyb2FkaW5zdGl0dXRlLmdpdGh1Yi5pby9waWNhcmQvKSB3aWxsIGlkZW50aWZ5IHN1Y2ggYXJ0ZWZhY3RzIGFuZCAqbWFyayogdGhlbSBmb3IgYXR0ZW50aW9uIGJ5IGRvd25zdHJlYW0gbWV0aG9kcy4gaS5lLiB0aGV5IGFyZSBub3QgY29tcGxldGVseSBkaXNjYXJkZWQgZnJvbSB0aGUgYW5hbHlzaXMuCgohW10obWVkaWEvcGNyX2R1cHMucG5nKQoKIyMjIyA0LiBNYXJrIER1cGxpY2F0ZXMgd2l0aCBQaWNhcmQKCjEuIFVzZSB0aGUgdG9vbCAqUGljYXJkIC0+IE1hcmtEdXBsaWNhdGVzKgoyLiBJbiAqU2VsZWN0IFNBTS9CQU0gZGF0YXNldCBvciBkYXRhc2V0IGNvbGxlY3Rpb24qIGNob29zZSB0aGUgYmFtIGZpbGUocykgcHJvZHVjZWQgYnkgYndhLW1lbS4KCjxkaXYgY2xhc3M9ImV4ZXJjaXNlIj4KKipFeGVyY2lzZSoqOiBVc2UgdGhlIGBNYXJrRHVwbGljYXRlc2AgdG9vbCB0byBpZGVudGlmeSBQQ1IgZHVwbGljYXRlcyBpbiB0aGUgYmFtIGZpbGUocykuIFZpZXcgdGhlIGJhbSBmaWxlcyBhbmQgc2Nyb2xsIHRocm91Z2ggdGhlIGRhdGEuIENhbiB5b3UgZmluZCBhbnkgcmVhZHMgdGhhdCBoYXZlIGJlZW4gaWRlbnRpZmllZCBhcyBkdXBsaWNhdGVzPyBZb3UgY2FuIHVzZSB0aGVpciAiZmxhZyIgb3IgYWxpZ25lZCBjb29yZGluYXRlcyB0byBmaW5kIHRoZW0uCjwvZGl2PgoKPGRpdiBjbGFzcz0id2FybmluZyI+CioqV2FybmluZyoqIHRoZSBhc3N1bXB0aW9uIGFib3V0IHJlYWRzIGhhdmluZyB0aGUgc2FtZSBzdGFydCBsb2NhdGlvbiBiZWluZyBQQ1IgZHVwbGljYXRlcyBmYWxscyBkb3duIHdoZW4gd2UgZG8gc2VxdWVuY2luZyBmb3IgYSB2ZXJ5IHNwZWNpZmljIHJlZ2lvbiBvZiB0aGUgZ2Vub21lLiBlLmcuIHRhcmdldGVkIHNlcXVlbmNpbmcgZnJvbSBhIHBhbmVsIG9mIGNhbmNlciBnZW5lcy4gUnVubmluZyBhIHRvb2wgdG8gbWFyayBQQ1IgZHVwbGljYXRlcyBvbiBzdWNoIGRhdGEgd291bGQgcmVjb21tZW5kIGEgaGlnaCBwcm9wb3J0aW9uIG9mIHJlYWRzIGJlIGlnbm9yZWQgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzLgo8L2Rpdj4KCiMjIyMgNS4gKE9wdGlvbmFsKSBSZS1ydW4gdGhlIGFsaWdubWVudCBzdGF0aXN0aWNzCgoxLiBTZWxlY3QgdGhlIHRvb2wgKlNBTS9CQU0gLT4gU2FtdG9vbHMgZmxhZ3N0YXQqIAoyLiBJbiB0aGUgKkJBTSBGaWxlIHRvIHJlcG9ydCBzdGF0aXN0aWNzIG9mKiBib3ggY2hvb3NlIHRoZSBiYW0gZmlsZSBwcm9kdWNlZCBieSB0aGUgKm1hcmsgZHVwbGljYXRlcyogc3RlcAoKCiMjIyMgNi4gRG93bmxvYWQgeW91ciBiYW0gZmlsZShzKQoKRm9yIHRoZSBuZXh0IHN0ZXAgeW91IHdpbGwgbmVlZCB0byBkb3dubG9hZCB0aGUgYGJhbWAgZmlsZXMgdGhhdCB5b3UgcHJvZHVjZWQuIFRvIGRvIHRoaXMsIHlvdSBjYW4gY2xpY2sgdGhlIGZsb3BweSBkaXNrIGljb24uCgohW10obWVkaWEvZG93bmxvYWRfYmFtLnBuZykKCioqTWFrZSBzdXJlIHRoYXQgeW91IGNsaWNrIGJvdGggRG93bmxvYWQgZGF0YXNldCBhbmQgRG93bmxvYWQgYmFtX2luZGV4KioKCiMgU2VjdGlvbiA1LiBWaXN1YWxpc2luZyB0aGUgYWxpZ25lZCByZWFkcyB3aXRoIElHVgoKV2hpbHN0IEJpb2luZm9ybWF0aWNzIHRvb2xzIGFyZSB2ZXJ5IHBvd2VyZnVsIGFuZCBhbGxvdyB5b3UgdG8gcGVyZm9ybSBzdGF0aXN0aWNhbCBhbmFseXNlcyBhbmQgdGVzdCBoeXBvdGhlc2VzLCB0aGVyZSBpcyBubyBzdWJzdGl0dXRlIGZvciAqKmxvb2tpbmcgYXQgYW5kIGV4cGxvcmluZyB0aGUgZGF0YSoqLiBBIHRyYWluZWQtZXllIGNhbiBxdWl0ZSBxdWlja2x5IGdldCBhIHNlbnNlIG9mIHRoZSBkYXRhIHF1YWxpdHkgYmVmb3JlIGFueSBjb21wdXRhdGlvbmFsIGFuYWx5c2VzIGhhdmUgYmVlbiBydW4uIEZ1cnRoZXJtb3JlLCBhcyB0aGUgcGVyc29uIHJlcXVlc3RpbmcgdGhlIHNlcXVlbmNpbmcsIHlvdSBwcm9iYWJseSBrbm93IGEgbG90IGFib3V0IHRoZSBiaW9sb2dpY2FsIGNvbnRleHQgb2YgdGhlIHNhbXBsZXMgYW5kIHdoYXQgdG8gZXhwZWN0LgoKV2Ugd2lsbCBsb2FkIHRoZSBhbGlnbmVkIHJlYWRzIHRoYXQgd2UgaGF2ZSBqdXN0IGNyZWF0ZWQgaW50byBJR1YgYW5kIHN0YXJ0IHRvIGdldCBhIGZlZWwgZm9yIHRoZSBwcm9jZXNzIG9mIHZhcmlhbnQgY2FsbGluZwoKMS4gRG93bmxvYWQgSUdWCgpZb3UgY2FuIGRvd25sb2FkIElHViBmb3IgV2luZG93cyB1c2luZyB0aGlzIGxpbmsgCgotIGh0dHBzOi8vc29mdHdhcmUuYnJvYWRpbnN0aXR1dGUub3JnL3NvZnR3YXJlL2lndi9kb3dubG9hZAoKCgo8Zm9udCBzaXplPSI1Ij4KSWYgeW91IGFyZSB1bmFibGUgdG8gZG93bmxvYWQgSUdWLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcnVuIGEgd2ViLWFwcCBmcm9tIHRoZSBCcm9hZCBJbnN0aXR1dGUgd2Vic2l0ZSB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuCgpodHRwczovL2lndi5vcmcvYXBwLwoKPC9mb250PgoKCjIuIExvYWQgYSByZWZlcmVuY2UgR2Vub21lIGFuZCBzb21lIERhdGEgVHJhY2tzCgpCeSBkZWZhdWx0LCBJR1Ygd2lsbCBsb2FkIHdpdGggdGhlIGxhc3QgZ2Vub21lIHRoYXQgeW91IHVzZWQuIEl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB1c2UgdGhlICoqc2FtZSBnZW5vbWUgdmVyc2lvbioqIHRoYXQgdGhlIHJlYWRzIHdlcmUgYWxpZ25lZCB0bzsgaW4gb3VyIGNhc2UgKipoZzM4KiouIFlvdSBjYW4gY2hlY2sgLyBjaGFuZ2UgdGhlIGdlbm9tZSBieSBjbGlja2luZyB0aGUgZHJvcC1kb3duIG1lbnUgaW4gdGhlIHVwcGVyLWxlZnQKCiFbXShtZWRpYS9zZWxlY3RfZ2Vub21lLlBORykKCldlIGNhbiBhbHNvIGxvYWQgZXh0cmEgKnRyYWNrcyogaW50byB0aGUgYnJvd3NlciB0aGF0IGNhbiBoZWxwIHVzIHVuZGVyc3RhbmQgb3VyIHZhcmlhbnQgY2FsbHMuIEZvciBleGFtcGxlLCB3ZSBjYW4gbG9hZCBkYXRhIGZyb20gKmRiU05QKiB3aGljaCB3aWxsIHRlbGwgdXMgYWJvdXQgY29tbW9uIG11dGF0aW9ucyB0aGF0IGFscmVhZHkgYmVlbiBpZGVudGlmaWVkLiBUaGVzZSBjYW4gYmUgbG9hZGVkIHZpYSAqRmlsZSogLT4gKkxvYWQgZnJvbSBTZXJ2ZXIuLiogYW5kIHNlbGVjdGluZyBgZGJTTlAgMS40LjdgIGZyb20gdGhlIGBWYXJpYXRpb24gYW5kIFJlcGVhdHNgIHNlY3Rpb24KCiFbXShtZWRpYS9hdmFpbGFibGVfZGF0YXNldHMuUE5HKQoKCjMuIE5hdmlnYXRlIGFyb3VuZCBJR1YKCldoZW4gSUdWIGxvYWRzIHVwIHdlIHN0YXJ0IHdpdGggYSB2ZXJ5IGhpZ2gtbGV2ZWwgdmlldyBvZiB0aGUgZ2Vub21lIHdoZXJlICphbGwqIGNocm9tb3NvbWVzIGFyZSB2aXNpYmxlLiBTdWNoIGEgdmlldyBtaWdodCBiZSB1c2VmdWwgaWYgd2Ugd2VyZSBpbnRlcmVzdGVkIGluIGxhcmdlIGNvcHktbnVtYmVyIHZhcmlhdGlvbiBhY3Jvc3MgYSBjb2hvcnQgb2Ygc2FtcGxlcy4gSG93ZXZlciwgd2UgYXJlIG1vc3RseSBpbnRlcmVzdGVkIGluIGNoYW5nZXMgYXQgdGhlIGluZGl2aWR1YWwgYmFzZS1sZXZlbCB3aGljaCBpcyBub3QgcG9zc2libGUgdG8gdmlldyBhdCB0aGlzIHJlc29sdXRpb24uIFdlIG5lZWQgdG8gbmF2aWdhdGUgdG8gYSBwYXJ0aWN1bGFyIHJlZ2lvbiBvZiBpbnRlcmVzdC4KCkFsb25nc2lkZSB0aGUgZHJvcC1kb3duIG1lbnUgdXNlZCB0byBjaGFuZ2UgdGhlIGdlbm9tZSwgdGhlcmUgaXMgYSBkcm9wLWRvd24gbWVudSB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIGNocm9tb3NvbWUgYW5kIGEgYm94IHdoZXJlIHdlIGNhbiBlbnRlciB0ZXh0LiBJbnNpZGUgdGhlIHRleHQgYm94IHdlIGNhbiBlbnRlciBhIHBhcnRpY3VsYXIgZ2Vub21lIGludGVydmFsIG9mIGludGVyZXN0CgplLmcuIGBjaHIxOjEwLDAwMC0xMSwwMDBgCgoKSUdWIHNob3VsZCBub3cgYmUgZGlzcGxheWluZyBhIHJlZ2lvbiBvbiBjaHJvbW9zb21lIDEgZnJvbSBiYXNlIHBvc2l0aW9uIGAxMCwwMDBgIHRvIGAxMSwwMDBgLiAKCiFbXShtZWRpYS96b29tX3JlZ2lvbi5wbmcpCgoKQXQgdGhpcyByZXNvbHV0aW9uLCB3ZSBjYW4gc3RhcnQgdG8gc2VlIHRoZSAqZ2Vub21lIHNlcXVlbmNlKi4gRWFjaCBETkEgYmFzZSBpcyByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBjb2xvdXIgKEEgPSBncmVlbiwgQyA9IGJsdWUpIGFuZCBpdCBzZWVtcyB0aGF0IHRoaXMgcmVnaW9uIGlzIGhpZ2hseS1yZXBldGl0aXZlOyBjb21wcmlzaW5nIG1vc3RseSBgQ2AgYmFzZXMuIFdlIGNhbiB6b29tIGZ1cnRoZXIgaW4gdXNpbmcgdGhlIHpvb20gY29udHJvbCBpbiB0aGUgdG9wIHJpZ2h0IG9mIElHVgoKIVtdKG1lZGlhL2hvd190b196b29tLlBORykKCldlIGNhbiB1c2UgdGhlIHpvb20gY29udHJvbCwgYW5kIGFsc28gbW92ZSBhbG9uZyB0aGUgZ2Vub21lIGJ5IGhvbGRpbmcgZG93biBieSBtb3VzZSBidXR0b24gYW5kIHNsaWRpbmcgbGVmdC1hbmQtcmlnaHQsIHRvIG5hdmlnYXRlIHRvIHdoYXRldmVyIGdlbm9taWMgbG9jYXRpb24gd2Ugd2FudC4gSWYgd2Uga25vd24gdGhlIG5hbWUgb2YgdGhlIGdlbmUgd2Ugd2FudCB0byBpbnRlcnJvZ2F0ZSB3ZSBjYW4gbmF2aWdhdGUgZGlyZWN0bHkgdGhlcmUgdXNpbmcgdGhlIHRleHQgYm94CgohW10obWVkaWEvc2VsZWN0X3JlZ2lvbi5QTkcpCgpUaGUgdGV4dCBib3ggc2hvdWxkIG5vdyB1cGRhdGUgdG8gc2hvdyB0aGUgY29vcmRpbmF0ZXMgb2YgYEFER1JFMmAgKGBjaHIxOTouLi4uYCkuIEF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiB3ZSBjYW4gbm93IHNlZSB0aGUgKmdlbmUgbW9kZWwqIGZvciB0aGUgZ2VuZSBgQURHUkUyYC4gIEdlbmVzIGFyZSByZXByZXNlbnRlZCBhcyBsaW5lcyBhbmQgYm94ZXMuIExpbmVzIHJlcHJlc2VudCBpbnRyb25pYyByZWdpb25zIGFuZCBib3hlcyByZXByZXNlbnQgZXhvbmljIHJlZ2lvbnMuIFRoZSBhcnJvd3MgaW5kaWNhdGUgdGhlIGRpcmVjdGlvbiAvIHN0cmFuZCBvZiB0cmFuc2NyaXB0aW9uIGZvciB0aGUgZ2VuZS4KCiFbXShtZWRpYS9nZW5lX3JlZ2lvbi5QTkcpCgo0LiBMb2FkIHRoZSBhbGlnbmVkIHJlYWRzCgpDaG9vc2UgRmlsZSA+IExvYWQgZnJvbSBGaWxlLi4uLCBzZWxlY3QgdGhlIGJhbSBmaWxlIHRoYXQgeW91IGRvd25sb2FkZWQgZnJvbSBHYWxheHksIGFuZCBjbGljayBPSy4gTm90ZSB0aGF0IHRoZSBiYW0gYW5kIGluZGV4IGZpbGVzIG11c3QgYmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGZvciBJR1YgdG8gbG9hZCB0aGVzZSBwcm9wZXJseS4KCgpUaGUgbWFpbiBkaXNwbGF5IG9mIElHViBzaG91bGQgbm93IHVwZGF0ZSB0byBob2xkIHRyYWNrcyBmb3IgdGhlIGFsaWduZWQgcmVhZHMgZnJvbSB0aGlzIGJhbSBmaWxlLiBJdCBtYXkgc2VlbSBsaWtlIG5vdGhpbmcgaXMgYmVpbmcgZGlzcGxheWVkLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIHpvb21lZC1vdXQgdG9vIGZhciB0byBiZSBhYmxlIHRvIHNlZSB0aGUgcmVhZHMuICoqVXNlIHRoZSB6b29tIGZ1bmN0aW9uIGFuZCBtb3ZlIGFsb25nIHRoZSBnZW5vbWUgdW50aWwgeW91IHN0YXJ0IHRvIHNlZSBzb21lIChtb3N0bHkpIGdyZXkgcmVjdGFuZ2xlcyoqLiBUaGVzZSBhcmUgdGhlIGFsaWduZWQgcmVhZHMuCgpJZiB5b3UgaG92ZXIgb3ZlciBhIHBhcnRpY3VsYXIgcmVhZCwgaG93IHdpbGwgc2VlIGNvbHVtbnMgZnJvbSB0aGUgYmFtIGZpbGUgYmVpbmcgZGlzcGxheWVkIHN1Y2ggYXMgdGhlIG1hcHBpbmcgcXVhbGl0eSBhbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhaXJlZCByZWFkcy4KCkNvbG91cmVkLWxldHRlcnMgd2l0aGluIHRoZSByZWFkIGluZGljYXRlIGJhc2VzIHRoYXQgYXJlIGRpZmZlcmVudCB0byB0aGUgcmVmZXJlbmNlIGdlbm9tZS4gVGhlIGVudGlyZSByZWFkIG1heSBiZSBjb2xvdXJlZCBkaWZmZXJlbnRseSB0byBncmV5LCB3aGljaCBjYW4gaW5kaWNhdGUgZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gaG93IHRoZSBkaXNwbGF5IGhhcyBiZWVuIGNvbmZpZ3VyZWQuIEZvciBleGFtcGxlLCBpdCBjYW4gaGlnaGxpZ2h0IHBhaXJlZC1yZWFkcyB3aXRoIGFuICppbnNlcnQgc2l6ZSogZGlmZmVyZW50IHRvIHRoYXQgZXhwZWN0ZWQgKFtzZWUgaGVyZV0oaHR0cHM6Ly9zb2Z0d2FyZS5icm9hZGluc3RpdHV0ZS5vcmcvc29mdHdhcmUvaWd2L2ludGVycHJldGluZ19pbnNlcnRfc2l6ZSkpIG9yIHJlYWRzIHdpdGggbG93IHF1YWxpdHkuIFRoZSBkaXNwbGF5IG9mIGFsaWduZWQgcmVhZHMgY2FuIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgbWVudXMsIGFzIGRlc2NyaWJlZCBbaGVyZV0oaHR0cDovL3NvZnR3YXJlLmJyb2FkaW5zdGl0dXRlLm9yZy9zb2Z0d2FyZS9pZ3YvUHJlZmVyZW5jZXMjQWxpZ25tZW50cykuIAoKIyMgU3VtbWFyeQoKVGhlIHByb2Nlc3Mgd2UgaGF2ZSBqdXN0IGZvbGxvd2VkIGlzIHN1bW1hcmlzZWQgaW4gdGhlIHdvcmtmbG93LgoKPGltZyBzcmM9Im1lZGlhL292ZXJhbGxfd29ya2Zsb3cucG5nIi8+CgpBcyBwYXJ0IG9mIHRoaXMgd29ya3Nob3Agc2VyaWVzLCB0aGVyZSB3aWxsIG5vdyBiZSBzZXNzaW9ucyBvbiB2YXJpYW50LWNhbGxpbmcgYW5kIFJOQS1zZXEuCgpXZSB3aWxsIG5vdCBjb3ZlciBDaElQLXNlcSBvciBtZXRoeWxhdGlvbi4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIHRoZXNlIHRvcGljcyB5b3UgY2FuIGNoZWNrIG91dCB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIEdhbGF4eSBUcmFpbmluZyBOZXR3b3JrCgotIFtFcGlnZW5ldGljcyBTZWN0aW9uIG9mIEdUTl0oaHR0cHM6Ly90cmFpbmluZy5nYWxheHlwcm9qZWN0Lm9yZy90cmFpbmluZy1tYXRlcmlhbC90b3BpY3MvZXBpZ2VuZXRpY3MvKQo=